Oracle中的隐藏功能

时间:2008-12-19 15:12:56

标签: oracle oracleinternals

我很喜欢有关hidden features in sql server

的答案和问题

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

21 个答案:

答案 0 :(得分: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.

答案 1 :(得分:12)

“全表扫描并不总是坏事。索引并不总是好的。”

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

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

然而,许多工具会查看此内容并查看“全表扫描”,并告诉您尝试使用索引。如果你这样做,那么你可能刚刚调整了你的代码。

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

答案 2 :(得分: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 |
 --------------------------------------------------------------------------

答案 3 :(得分:8)

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

答案 4 :(得分:8)

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

Select *
  from my_table as of timestamp(timestamp '2008-12-01 15:21:13')

11g有一个全新的功能集,可以更有力地保留历史变化。

答案 5 :(得分: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

给你:

-Cars-                   -maker-
Corvette, Impala, Aveo   Chevy
Taurus                   Ford

答案 6 :(得分:7)

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

答案 7 :(得分:6)

答案 8 :(得分:5)

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

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

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

太酷了。

答案 9 :(得分:4)

如果您在PASSWORD上获得DBA_USERS列的值,则可以在不知情的情况下备份/恢复密码:

 ALTER USER xxx IDENTIFIED BY VALUES 'xxxx';

答案 10 :(得分:3)

绕过缓冲区缓存并使用直接路径读取直接从磁盘读取。

alter session set "_serial_direct_read"=true;

导致表空间(9i)或快速对象(10g +)检查点,因此在繁忙的OLTP系统上要小心。

答案 11 :(得分:3)

http://awads.net/wp/tag/undocumented/

的更多未记录的内容

警告:使用风险自负。

答案 12 :(得分:3)

答案 13 :(得分:3)

我不知道这是否算作隐藏,但当我看到这种方式快速查看您正在调整的SQL语句时,我感到非常高兴。

SELECT /*+ GATHER_PLAN_STATISTICS */ * FROM DUAL;

SELECT * FROM TABLE(dbms_xplan.display_cursor( NULL, NULL, 'RUNSTATS_LAST'))
;

PLAN_TABLE_OUTPUT
-----------------------------------------------------
SQL_ID  5z36y0tq909a8, child number 0
-------------------------------------
SELECT /*+ GATHER_PLAN_STATISTICS */ * FROM DUAL

Plan hash value: 272002086

---------------------------------------------------------------------------------------------
| Id  | Operation         | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |
---------------------------------------------------------------------------------------------
|   1 |  TABLE ACCESS FULL| DUAL |      1 |      1 |      1 |00:00:00.02 |       3 |      2 |
---------------------------------------------------------------------------------------------


12 rows selected.

其中:

  • E-Rows是估计的行数。
  • A-Rows是实际行。
  • A-Time是实际时间。
  • 缓冲区是实际的缓冲区。

如果估计的计划与实际执行的数量级有所不同,那么您就知道自己遇到了问题。

答案 14 :(得分:3)

不是隐藏的功能,但是细粒度访问控制(FGAC),也称为行级安全性,是我过去使用过的,并且对其实现的效率印象深刻。如果您正在寻找一些可以保证您可以控制行向不同权限的用户公开的粒度 - 无论用于查看数据的应用程序(SQL * Plus以及您的Web应用程序) - 那么这是一个宝石

内置的全文索引有更广泛的文档记录,但由于其稳定性仍然很突出(只是尝试在MS-SQL和Oracle上的类似数据样本上运行全文索引列的完全重建索​​引,你会看到速度差异。)

答案 15 :(得分:2)

Snapshot表。也可以在Oracle Lite中找到,对于滚动自己的复制机制非常有用。

答案 16 :(得分:2)

@Peter

您实际上可以在TOAD中绑定“Cursor”类型的变量,然后在语句中使用它,它将在结果网格中显示结果。

exec open :cur for select * from dual;

答案 17 :(得分:1)

Model Clause(适用于Oracle 10g及更高版本)

答案 18 :(得分:1)

问:如何使用TOAD中的光标调用存储?

答:例如,更改光标,包名和存储过程名称

declare cursor PCK_UTILS.typ_cursor;  

begin   
    PCK_UTILS.spc_get_encodedstring(  
        'U',  
        10000002,  
        null,  
        'none',  
        cursor);  
end;

答案 19 :(得分:1)

用于字符串聚合的WM_CONCAT

答案 20 :(得分:1)

Scalar subquery caching是Oracle中最令人惊讶的功能之一

-- my_function is NOT deterministic but it is cached!
select t.x, t.y, (select my_function(t.x) from dual)
from t

-- logically equivalent to this, uncached
select t.x, t.y, my_function(t.x) from t

上面的“缓存”子查询仅针对my_function(t.x)的唯一值评估t.x一次。如果您拥有相同t.x值的大分区,即使my_function 声明为DETERMINISTIC,这也会极大地加快您的查询速度。即使它是DETERMINISTIC,您也可以安全地使用昂贵的SQL - > PL / SQL上下文切换。

当然,如果my_function不是确定性函数,那么这会导致错误的结果,所以要小心!