Oracle中的隐藏功能

Pet*_*der 24 oracle oracleinternals

我喜欢sql server中隐藏功能的答案和问题

您能告诉我们有关Oracle的信息吗?
隐藏的表,...的内部工作,秘密存储过程,具有良好工具的包...

Ton*_*ews 15

由于Apex现在是每个Oracle数据库的一部分,因此即使您不使用Apex,这些Apex实用程序功能也很有用:

SQL> declare
  2    v_array apex_application_global.vc_arr2;
  3    v_string varchar2(2000);
  4  begin
  5  
  6    -- Convert delimited string to array
  7    v_array := apex_util.string_to_table('alpha,beta,gamma,delta', ',');
  8    for i in 1..v_array.count
  9    loop
 10      dbms_output.put_line(v_array(i));
 11    end loop;
 12  
 13    -- Convert array to delimited string
 14    v_string := apex_util.table_to_string(v_array,'|');
 15    dbms_output.put_line(v_string);
 16  end;
 17  /
alpha
beta
gamma
delta
alpha|beta|gamma|delta

PL/SQL procedure successfully completed.
Run Code Online (Sandbox Code Playgroud)


Dav*_*dge 12

"全表扫描并不总是坏事.索引并不总是好的."

当您根据每个工作单元访问的行(通常是每个逻辑读取)测量时,基于索引的访问方法在读取行时的效率低于完全扫描.然而,许多工具会将全表扫描解释为低效率的标志.

举一个例子,您可以在发票表中阅读几百张发票,并在小型查找表中查找付款方式.使用索引来探测每个发票的查找表可能意味着每个发票有三个或四个逻辑io.但是,为发票数据中的散列连接做准备的查找表的完整扫描可能只需要几个逻辑读取,并且散列连接本身在内存中几乎不需要任何费用.

但是,许多工具会查看此内容并查看"全表扫描",并告诉您尝试使用索引.如果您这样做,那么您可能刚刚调整了代码.

顺便说一句,过度依赖索引,如上例所示,导致"缓冲区高速缓存命中率"上升.这就是为什么BCHR主要是无意义的系统效率预测器.


Dav*_*dge 9

基数提示大多没有记录.

 explain plan for
 select /*+ cardinality(@inner 5000) */ *
 from   (select /*+ qb_name(inner) */ * from dual)
 /
 select * from table(dbms_xplan.display)
 /
 --------------------------------------------------------------------------
 | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
 --------------------------------------------------------------------------
 |   0 | SELECT STATEMENT  |      |  5000 | 10000 |     2   (0)| 00:00:01 |
 |   1 |  TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |
 --------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)


Dav*_*dge 8

作为系统效率的预测器,缓冲区高速缓存命中率实际上毫无意义


Dav*_*dge 8

您可以使用闪回查询查看上一次的表数据,但有一定的限制.

Select *
  from my_table as of timestamp(timestamp '2008-12-01 15:21:13')
Run Code Online (Sandbox Code Playgroud)

11g有一个全新的功能集,可以更加健壮地保留历史变化.


Dav*_*dge 7

频繁重建索引几乎总是浪费时间.


jle*_*jle 7

wm_concat的工作方式与MySql group_concat类似,但它没有记录.

有数据:

-car-   -maker-
Corvette Chevy
Taurus   Ford
Impala   Chevy
Aveo     Chevy

select wm_concat(car) Cars, maker from cars
group by maker
Run Code Online (Sandbox Code Playgroud)

给你:

-Cars-                   -maker-
Corvette, Impala, Aveo   Chevy
Taurus                   Ford
Run Code Online (Sandbox Code Playgroud)


小智 5

我刚刚发现了伪列Ora_rowSCN.如果您没有为此设置表,则此pcolumn将为您提供块SCN.这可能对紧急情况非常有用,"哦,我没有在这张桌子上进行审核,并想知道是否有人自昨天起改变了数据."

但更好的是,如果您创建具有Rowdependecies ON的表.这使得最后一次改变的SCN成为每一行.这将帮助您避免"丢失编辑"问题,而无需在查询中包含每一列.

IOW,当你的app抓取一行进行用户修改时,也选择Ora_rowscn.然后,当您发布用户的编辑时,除了where子句中的唯一键外,还包括Ora_rowscn = v_rscn.如果有人因为你抓住它而触及该行,也就是丢失编辑,更新将匹配零行,因为ora_rowscn将会改变.

非常酷.


Pet*_*der 1

问:如何从 TOAD 调用带有游标的存储?

A: 例如,更改您的光标、包名和存储过程名称

declare cursor PCK_UTILS.typ_cursor;  

begin   
    PCK_UTILS.spc_get_encodedstring(  
        'U',  
        10000002,  
        null,  
        'none',  
        cursor);  
end;
Run Code Online (Sandbox Code Playgroud)