本文章为学习笔记,为了方便查阅,收录于此
大部分为以前学习基于CBO的ORACLE优化一书(崔华著),加上自己的实验
如果记录有误请指出
1、gather_plan_statistics HINT 用于记录SQL执行时的额外信息,如果实际执行次数,执行时间,物理逻辑读等。
select /*+ gather_plan_statistics */ count(*) from pp;
后执行如下的任何一句可以查看相应的信息
select * from table(dbms_xplan.display_cursor(null,null,'iostats last')); (I/O)
SELECT * FROM table(dbms_xplan.display_cursor(NULL, NULL, 'memstats last'));(PGA)
SELECT * FROM table(dbms_xplan.display_cursor(NULL, NULL, 'runstats_last'));
select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
select * from table(dbms_xplan.display_cursor(null,null,'last'));(执行计划)
select * from table(dbms_xplan.display_cursor(null,null,'iostats last +memstats last +COST +BYTES +PEEKED_BINDS +ALIAS'));
本HINT可以使用alter session set statistics_level = all进行代替
2、driving_site HINT 用于在分布式查询中SQL在哪里执行可以再本地或者在远端,如下的语句执行计划是不同的
select /*+ driving_site(a) */ * from dual@sil a,dual b
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT REMOTE| | 1 | 4 | 4 (0)| 00:00:01 |
| 1 | MERGE JOIN CARTESIAN | | 1 | 4 | 4 (0)| 00:00:01 |
| 2 | REMOTE | DUAL | 1 | 2 | 2 (0)| 00:00:01 |
| 3 | BUFFER SORT | | 1 | 2 | 2 (0)| 00:00:01 |
| 4 | TABLE ACCESS FULL | DUAL | 1 | 2 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------------
select /*+ driving_site(b) */ * from dual@sil a,dual b
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | In
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 4 | 4 (0)| 00:00:01 |
| 1 | MERGE JOIN CARTESIAN| | 1 | 4 | 4 (0)| 00:00:01 |
| 2 | REMOTE | DUAL | 1 | 2 | 2 (0)| 00:00:01 |
| 3 | BUFFER SORT | | 1 | 2 | 2 (0)| 00:00:01 |
| 4 | TABLE ACCESS FULL | DUAL | 1 | 2 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------------
3、qb_name 为查询块自定义名字(QUERY BLOCK )
select /*+ qb_name(testour) */ * from test where name3 is null;
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 2 (100)| |
|* 1 | TABLE ACCESS FULL| TEST | 1 | 106 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - TESTOUR / TEST@TESTOUR
4、ALL_ROWS FIRST_ROWS(n) 指定优化器评估是评估语句执行资源消耗最少还是根据最快返回N行记录的消耗来评估,
注意这种情况FIRST_ROWS(n) 的COST远小于ALL_ROWS,可能导致错误的执行计划。
select /*+ first_rows(1) */ * from testscn;
--------------------------------------------------------------------------------
Plan hash value: 3875681502
-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 105K| 3806K| 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| TESTSCN | 105K| 3806K| 2 (0)| 00:00:01 |
-----------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL1/TESTSCN@SEL1
select /*+ all_rows */ * from testscn;
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3875681502
-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 105K| 3806K| 103 (1)| 00:00:02 |
| 1 | TABLE ACCESS FULL| TESTSCN | 105K| 3806K| 103 (1)| 00:00:02 |
-----------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL1/TESTSCN@SEL1
5、full 针对单表进行全表扫描
select /*+ full(testscn) */ * from testscn;
--------------------------------------------------------------------------------
Plan hash value: 3875681502
-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 105K| 3806K| 103 (1)| 00:00:02 |
| 1 | TABLE ACCESS FULL| TESTSCN | 105K| 3806K| 103 (1)| 00:00:02 |
-----------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL1/TESTSCN@SEL1
6、INDEX 针对单表,考虑使用索引。方式如下四种:
使用索引testscn的TESTSCN_INDEX
select /*+ index(testscn TESTSCN_INDEX ) */ * from testscn where id is not null and name is not null;
考虑testscn上的所有索引,考虑COST最低的或者INDEX链接操作等
select /*+ index(testscn) */ * from testscn where id is not null and name is not null;
考虑testscn上的TESTSCN_INDEX 和TESTSCN_INDEX2 所以,考虑COST最低的或者INDEX链接操作等
select /*+ index(testscn TESTSCN_INDEX testscn_index2 ) */ * from testscn where id is not null and name is not null;
考虑testscn上id和name列的索引,考虑COST最低的或者INDEX链接操作等
select /*+ index(testscn (id) (name) ) */ * from testscn where id is not null and name is not null;
--------------------------------------------------------------------------------
Plan hash value: 3572127329
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 105K| 3806K| 583 (1
|* 1 | TABLE ACCESS BY INDEX ROWID| TESTSCN | 105K| 3806K| 583 (1
|* 2 | INDEX FULL SCAN | TESTSCN_INDEX | 105K| | 224 (1
--------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL1/TESTSCN@SEL1
2 - SEL1/TESTSCN@SEL1
7、NO_INDEX针对单表,考虑不会用指定索引
不使用索引TESTSCN_INDEX,但是使用testscn_index2索引
select /*+ no_index(testscn TESTSCN_INDEX) index(testscn testscn_index2 ) */ * from testscn where id=2 and name is not null;
不使用索引TESTSCN_INDEX,TESTSCN_INDEX2索引
select /*+ no_index(testscn TESTSCN_INDEX TESTSCN_INDEX2) */ * from testscn where id=2 and name is not null;
不使用testscn表上所有索引
select /*+ no_index(testscn) */ * from testscn where id=2 and name is not null;
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1122084783
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CP
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 148 | 627 (
|* 1 | TABLE ACCESS BY INDEX ROWID| TESTSCN | 4 | 148 | 627 (
|* 2 | INDEX FULL SCAN | TESTSCN_INDEX2 | 105K| | 268 (
--------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL1/TESTSCN@SEL1
2 - SEL1/TESTSCN@SEL1
8、INDEX_DESC针对单表,与索引相反的方式进行扫描(升序为降序,降序为升序)
不使用索引TESTSCN_INDEX,但是使用testscn_index2索引,并且扫描testscn_index2为降序
select /*+ no_index(testscn TESTSCN_INDEX) index_DESC(testscn testscn_index2 ) */ * from testscn where id=2 and name is not null;
考虑testscn上的所有索引,考虑COST最低的或者INDEX链接操作等
select /*+ index_DESC(testscn) */ * from testscn where id is not null and name is not null;
考虑testscn上的TESTSCN_INDEX 和TESTSCN_INDEX2 所以,考虑COST最低的或者INDEX链接操作等,并且扫描为降序
select /*+ index_DESC(testscn TESTSCN_INDEX testscn_index2 ) */ * from testscn where id is not null and name is not null;
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3045085307
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CP
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 148 | 627 (
|* 1 | TABLE ACCESS BY INDEX ROWID| TESTSCN | 4 | 148 | 627 (
|* 2 | INDEX FULL SCAN DESCENDING| TESTSCN_INDEX2 | 105K| | 268 (
--------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL1/TESTSCN@SEL1
2 - SEL1/TESTSCN@SEL1
9、INDEX_COMBINE 针对单个目标,让优化器对多个索引进行位图布尔运算,然后进行转化为ROWID,一般这样的执行计划代价较大
可以考虑更改
_b_tree_bitmap_plans为FALSE 来禁用B-TREE索引进行COMBINE转换操作
指定表TESTSCN上的TESTSCN_INDEX,TESTSCN_INDEX2进行COMBINE操作
select /*+ index_combine(testscn TESTSCN_INDEX TESTSCN_INDEX2) */ * from testscn where id=2 and name='gaopeng'
指定表TESTSCN上的所有索引考虑进行COMBINE操作
select /*+ index_combine(testscn ) */ * from testscn where id=2 and name='gaopeng'
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2845944253
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 21 | 26
| 1 | TABLE ACCESS BY INDEX ROWID | TESTSCN | 1 | 21 | 26
| 2 | BITMAP CONVERSION TO ROWIDS | | | |
| 3 | BITMAP AND | | | |
| 4 | BITMAP CONVERSION FROM ROWIDS| | | |
|* 5 | INDEX RANGE SCAN | TESTSCN_INDEX | | |
| 6 | BITMAP CONVERSION FROM ROWIDS| | | |
|* 7 | INDEX RANGE SCAN | TESTSCN_INDEX2 | | | 26
--------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL1/TESTSCN@SEL1
10、INDEX_JOIN 针对单表,当通过多个索引扫描可以得到所有的查询内容和WHERE谓词条件及不需要回表操作。
select /*+ index_join(testscn TESTSCN_INDEX TESTSCN_INDEX2) */ id,name from testscn where id=2 and name='gaopeng';
select /*+ index_join(testscn) */ id,name from testscn where id=2 and name='gaopeng';
具体解释和前面一致
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 782341378
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Tim
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 269 (1)| 00:
|* 1 | VIEW | indexjoin_001 | 1 | 13 | 269 (1)| 00:
|* 2 | HASH JOIN | | | | |
|* 3 | INDEX RANGE SCAN| TESTSCN_INDEX | 1 | 13 | 1 (0)| 00:
|* 4 | INDEX RANGE SCAN| TESTSCN_INDEX2 | 1 | 13 | 268 (1)| 00:
--------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL2AEE34FF/TESTSCN@SEL1
2 - SEL2AEE34FF3−SEL2AEE34FF / indexjoinalias_001@SEL2AEE34FF4−SEL2AEE34FF / indexjoinalias_002@SEL2AEE34FF11、ANDEQUAL针对单表,其成立条件为WHERE条件中有针对不同列的单值条件,并且这些列上都有单值索引,其最大个数为5select/∗+ANDEQUAL(testscnTESTSCNINDEXTESTSCNINDEX2)∗/∗fromtestscnwhereid=2andname=′gaopeng′具体解释和前面一致PLANTABLEOUTPUT−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−Planhashvalue:1514933407−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|Id|Operation|Name|Rows|Bytes|Cost(−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|0|SELECTSTATEMENT||1|21|269(|∗1|TABLEACCESSBYINDEXROWID|TESTSCN|1|21|269(|2|AND−EQUAL|||||∗3|INDEXRANGESCAN|TESTSCNINDEX|1||1(|∗4|INDEXRANGESCAN|TESTSCNINDEX2|99991||267(−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−QueryBlockName/ObjectAlias(identifiedbyoperationid):−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−1−SEL1 / TESTSCN@SEL13−SEL1 / TESTSCN@SEL1如果我们使用ID列上的联合索引:CREATEINDEXTESTSCNINDEX3ONTESTSCN(ID,DEPT);然后select/∗+ANDEQUAL(testscnTESTSCNINDEX3TESTSCNINDEX2)∗/∗fromtestscnwhereid=2andname=′gaopeng′;具体解释和前面一致其执行计划为:PLANTABLEOUTPUT−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−Planhashvalue:9349066−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|Id|Operation|Name|Rows|Bytes|Cost(−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|0|SELECTSTATEMENT||1|21|2(0|∗1|TABLEACCESSBYINDEXROWID|TESTSCN|1|21|2(0|∗2|INDEXRANGESCAN|TESTSCNINDEX|1||1(0−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−QueryBlockName/ObjectAlias(identifiedbyoperationid):−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−1−SEL1 / TESTSCN@SEL12−SEL1 / TESTSCN@SEL1可以看到ANDEQUAL不能生效。因为(并且这些列上都有单值索引)条件不符合。12、INDEXFFS针对单表,当索引中包含了所有查询内容和WHERE谓词条件,不需要回表可以使用。select/∗+INDEXFFS(testscnTESTSCNINDEX3TESTSCNINDEX2)∗/id,deptfromtestscnwhereid=2anddept=′gaopeng′;select/∗+INDEXFFS(testscnTESTSCNINDEX3)∗/id,deptfromtestscnwhereid=2anddept=′gaopeng′;select/∗+INDEXFFS(testscn)∗/id,deptfromtestscnwhereid=2anddept=′gaopeng′;具体解释和前面一致PLANTABLEOUTPUT−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−Planhashvalue:72126314−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|Id|Operation|Name|Rows|Bytes|Cost(−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|0|SELECTSTATEMENT||1|13|93(2)|00:|∗1|INDEXFASTFULLSCAN|TESTSCNINDEX3|1|13|93(2)|00:−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−QueryBlockName/ObjectAlias(identifiedbyoperationid):−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−1−SEL1 / TESTSCN@SEL113、ordered针对多个表进行连接的HINT,他会按照FROM后的顺序,第一表作为驱动结果集。select/∗+ordered∗/∗fromdept1d,dept2b,emp1ewhereb.deptno=e.deptnoande.deptno=d.deptno;PLANTABLEOUTPUT−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−Planhashvalue:3516109060−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|Id|Operation|Name|Rows|Bytes|Cost(−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|0|SELECTSTATEMENT||14|2058|13(8)|00:00:01||∗1|HASHJOIN||14|2058|13(8)|00:00:01||2|MERGEJOINCARTESIAN||16|960|9(0)|00:00:01||3|TABLEACCESSFULL|DEPT1|4|120|3(0)|00:00:01||4|BUFFERSORT||4|120|6(0)|00:00:01||5|TABLEACCESSFULL|DEPT2|4|120|2(0)|00:00:01||6|TABLEACCESSFULL|EMP1|14|1218|3(0)|00:00:01|−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−QueryBlockName/ObjectAlias(identifiedbyoperationid):−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−1−SEL1
3 - SEL1/D@SEL1
5 - SEL1/B@SEL1
14、leading 针对多个表进行连接的HINT,强制LEADING中的表至左向右,第一个为驱动表,如果未在LEADING中出现由ORACLE自动判断。
select /*+ leading (b d )*/ * from dept1 d,dept2 b,emp1 e where b.deptno=e.deptno and e.deptno=d.deptno ;
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 2058 | 13 (8)| 00:00:01 |
|* 1 | HASH JOIN | | 14 | 2058 | 13 (8)| 00:00:01 |
| 2 | MERGE JOIN CARTESIAN| | 16 | 960 | 9 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL | DEPT2 | 4 | 120 | 3 (0)| 00:00:01 |
| 4 | BUFFER SORT | | 4 | 120 | 6 (0)| 00:00:01 |
| 5 | TABLE ACCESS FULL | DEPT1 | 4 | 120 | 2 (0)| 00:00:01 |
| 6 | TABLE ACCESS FULL | EMP1 | 14 | 1218 | 3 (0)| 00:00:01 |
-------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL13−SEL1 / B@SEL15−SEL1 / D@SEL115、usemerge针对多个目标表,指定一个或者多个表为被驱动表select/∗+leading(b)usemerge(de)∗/∗fromdept1d,dept2b,emp1ewhereb.deptno=e.deptnoande.deptno=d.deptno;Planhashvalue:2466184505−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|Id|Operation|Name|Rows|Bytes|Cost(−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|0|SELECTSTATEMENT||14|2058|12(25)|00:00:01||1|MERGEJOIN||14|2058|12(25)|00:00:01||2|MERGEJOIN||14|1638|8(25)|00:00:01||3|SORTJOIN||4|120|4(25)|00:00:01||4|TABLEACCESSFULL|DEPT2|4|120|3(0)|00:00:01||∗5|SORTJOIN||14|1218|4(25)|00:00:01||6|TABLEACCESSFULL|EMP1|14|1218|3(0)|00:00:01||∗7|SORTJOIN||4|120|4(25)|00:00:01||8|TABLEACCESSFULL|DEPT1|4|120|3(0)|00:00:01|−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−QueryBlockName/ObjectAlias(identifiedbyoperationid):−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−1−SEL1
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
4 - SEL1/B@SEL1
6 - SEL1/E@SEL1
8 - SEL1/D@SEL1
16、no_use_merge:针对多个目标表,指定多个被驱动表不能使用MERGE JION
select /*+ leading(dept) no_use_merge(emp) */ * from dept,emp where emp.deptno=dept.deptno;
17、USE_NL:针对多个目标表,指定一个或者多个表为被驱动表,当USE_NL有多个表的时候ORACLE自动选择连接顺序
select /*+ leading (e b) use_nl(d)*/ * from dept1 d,dept2 b,emp1 e where b.deptno=e.deptno and e.deptno=d.deptno
select /*+ leading (e ) use_nl(b d)*/ * from dept1 d,dept2 b,emp1 e where b.deptno=e.deptno and e.deptno=d.deptno
SQL> select * from table(dbms_xplan.display(null,null,' advanced'));
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value: 111324804
-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 1092 | 24 (5)| 00:00:01 |
| 1 | NESTED LOOPS | | 14 | 1092 | 24 (5)| 00:00:01 |
|* 2 | HASH JOIN | | 14 | 812 | 7 (15)| 00:00:01 |
| 3 | TABLE ACCESS FULL| EMP1 | 14 | 532 | 3 (0)| 00:00:01 |
| 4 | TABLE ACCESS FULL| DEPT2 | 4 | 80 | 3 (0)| 00:00:01 |
|* 5 | TABLE ACCESS FULL | DEPT1 | 1 | 20 | 1 (0)| 00:00:01 |
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL13−SEL1 / E@SEL14−SEL1 / B@SEL15−SEL1 / D@SEL118、NOUSENL:针对多个目标表,指定多个被驱动表不能使用NESTLOOP连接方式select/∗+leading(emp)nousenl(dept)∗/∗fromemp,deptwhereemp.deptno=dept.deptnoandempno=7369;19、usehash:针对多个目标表,指定一个或者多个表为被驱动表,当USEHASH有多个表的时候ORACLE自动选择连接顺序select/∗+leading(emp)usehash(dept)∗/∗fromemp,deptwhereemp.deptno=dept.deptno;select/∗+leading(emp)usehash(dept1dept)∗/∗fromemp,dept,DEPT1whereemp.deptno=dept.deptnoandemp.deptno=dept1.deptno;PLANTABLEOUTPUT−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−Planhashvalue:1123238657−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|Id|Operation|Name|Rows|Bytes|Cost(−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|0|SELECTSTATEMENT||14|812|7(15)|00:00:01||∗1|HASHJOIN||14|812|7(15)|00:00:01||2|TABLEACCESSFULL|EMP|14|532|3(0)|00:00:01||3|TABLEACCESSFULL|DEPT|4|80|3(0)|00:00:01|−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−PLANTABLEOUTPUT−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−QueryBlockName/ObjectAlias(identifiedbyoperationid):−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−1−SEL1
2 - SEL1/EMP@SEL1
3 - SEL1/DEPT@SEL1
20、NO_USE_HASH:针对多个目标表,指定多个被驱动表不能使用hash join 连接方式
select /*+ no_use_hash(emp) */ * from emp,dept where emp.deptno=dept.deptno ;
21、use_conact:针对目标SQL的HINT,让优化器对目标SQL使用IN-LIST扩展或者OR扩展
alter session set events '10142 trace name context forever';
alter session set events '10157 trace name context forever';
select /*+ use_concat */ * from emp where empno in (7654,7698);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2259546459
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Tim
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2 | 76 | 2 (0)| 00:
| 1 | CONCATENATION | | | | |
| 2 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 38 | 1 (0)| 00:
|* 3 | INDEX UNIQUE SCAN | PK_EMP | 1 | | 0 (0)| 00:
| 4 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 38 | 1 (0)| 00:
|* 5 | INDEX UNIQUE SCAN | PK_EMP | 1 | | 0 (0)| 00:
--------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL12−SEL1_1 / EMP@SEL13−SEL1_1 / EMP@SEL14−SEL1_2 / EMP@SEL12PLANTABLEOUTPUT−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−5−SEL1_2 / EMP@SEL1222、noexpand:针对目标SQL的HINT,让优化器对目标SQL不使用IN−LIST扩展或者OR扩展,是USECONCAT的反义SQL>explainplanforselect/∗+noexpand∗/∗fromempwhereempnoin(7654,7698);ExplainedSQL>select∗fromtable(dbmsxplan.display(null,null,′advanced′));PLANTABLEOUTPUT−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−Planhashvalue:3202029772−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|Id|Operation|Name|Rows|Bytes|Cost(−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|0|SELECTSTATEMENT||2|76|2(0)||1|TABLEACCESSBYINDEXROWID|EMP|2|76|2(0)||2|BITMAPCONVERSIONTOROWIDS||||||3|BITMAPOR||||||4|BITMAPCONVERSIONFROMROWIDS||||||∗5|INDEXRANGESCAN|PKEMP|||0(0)||6|BITMAPCONVERSIONFROMROWIDS||||||∗7|INDEXRANGESCAN|PKEMP|||0(0)|−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−QueryBlockName/ObjectAlias(identifiedbyoperationid):−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−1−SEL1 / EMP@SEL123、nomerge:针对单个目标视图的HINT,让优化器不使用视图合并select∗fromemp,(select/∗+nomerge∗/∗fromdeptwhereloc=′CHICAGO′)deptviewinlinewhereemp.deptno=deptviewinline.deptno;PLANTABLEOUTPUT−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−Planhashvalue:2910064727−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|Id|Operation|Name|Rows|Bytes|Cost(−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|0|SELECTSTATEMENT||5|340|7(15)|00:00:01||∗1|HASHJOIN||5|340|7(15)|00:00:01||2|VIEW||1|30|3(0)|00:00:01||∗3|TABLEACCESSFULL|DEPT|1|20|3(0)|00:00:01||4|TABLEACCESSFULL|EMP|14|532|3(0)|00:00:01|−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−QueryBlockName/ObjectAlias(identifiedbyoperationid):−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−1−SEL1
2 - SEL2/DEPTVIEWINLINE@SEL1
3 - SEL2/DEPT@SEL2
4 - SEL1/EMP@SEL1
24、
no_merge:针对单个目标视图的HINT,让优化器使用视图合并
select *
from emp,
(select /*+ merge */
*
from dept
where loc = 'CHICAGO') dept_view_inline
where emp.deptno = dept_view_inline.deptno;
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 844388907
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Ti
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5 | 290 | 6 (17)| 00
| 1 | MERGE JOIN | | 5 | 290 | 6 (17)| 00
|* 2 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 20 | 2 (0)| 00
| 3 | INDEX FULL SCAN | PK_DEPT | 4 | | 1 (0)| 00
|* 4 | SORT JOIN | | 14 | 532 | 4 (25)| 00
| 5 | TABLE ACCESS FULL | EMP | 14 | 532 | 3 (0)| 00
--------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SELF5BB74E12−SELF5BB74E1 / DEPT@SEL23−SELF5BB74E1 / DEPT@SEL25−SELF5BB74E1 / EMP@SEL125、nounnest针对子查询的HINT,不让优化器使用子查询展开操作select∗fromempwheredeptnonotin(select/∗+nounnest∗/deptnofromdeptwhereloc=′CHICAGO′);PLANTABLEOUTPUT−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−Planhashvalue:1499841400−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|Id|Operation|Name|Rows|Bytes|Cost(−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|0|SELECTSTATEMENT||9|342|12(0)|00:00:01||∗1|FILTER|||||||2|TABLEACCESSFULL|EMP|14|532|3(0)|00:00:01||∗3|TABLEACCESSFULL|DEPT|1|11|3(0)|00:00:01|−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−QueryBlockName/ObjectAlias(identifiedbyoperationid):−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−1−SEL1
2 - SEL1/EMP@SEL1
3 - SEL2/DEPT@SEL2
26、unnest 针对子查询的HINT,让优化器使用子查询展开操作
select *
from emp
where deptno not in (select /*+ unnest */
deptno
from dept
where loc = 'CHICAGO');
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3248063469
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 9 | 441 | 7 (15)| 00:00:01 |
|* 1 | HASH JOIN ANTI SNA| | 9 | 441 | 7 (15)| 00:00:01 |
| 2 | TABLE ACCESS FULL| EMP | 14 | 532 | 3 (0)| 00:00:01 |
|* 3 | TABLE ACCESS FULL| DEPT | 1 | 11 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL5DA710D32−SEL5DA710D3 / EMP@SEL13−SEL5DA710D3 / DEPT@SEL$2
大部分为以前学习基于CBO的ORACLE优化一书(崔华著),加上自己的实验
如果记录有误请指出
1、gather_plan_statistics HINT 用于记录SQL执行时的额外信息,如果实际执行次数,执行时间,物理逻辑读等。
select /*+ gather_plan_statistics */ count(*) from pp;
后执行如下的任何一句可以查看相应的信息
select * from table(dbms_xplan.display_cursor(null,null,'iostats last')); (I/O)
SELECT * FROM table(dbms_xplan.display_cursor(NULL, NULL, 'memstats last'));(PGA)
SELECT * FROM table(dbms_xplan.display_cursor(NULL, NULL, 'runstats_last'));
select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
select * from table(dbms_xplan.display_cursor(null,null,'last'));(执行计划)
select * from table(dbms_xplan.display_cursor(null,null,'iostats last +memstats last +COST +BYTES +PEEKED_BINDS +ALIAS'));
本HINT可以使用alter session set statistics_level = all进行代替
2、driving_site HINT 用于在分布式查询中SQL在哪里执行可以再本地或者在远端,如下的语句执行计划是不同的
select /*+ driving_site(a) */ * from dual@sil a,dual b
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT REMOTE| | 1 | 4 | 4 (0)| 00:00:01 |
| 1 | MERGE JOIN CARTESIAN | | 1 | 4 | 4 (0)| 00:00:01 |
| 2 | REMOTE | DUAL | 1 | 2 | 2 (0)| 00:00:01 |
| 3 | BUFFER SORT | | 1 | 2 | 2 (0)| 00:00:01 |
| 4 | TABLE ACCESS FULL | DUAL | 1 | 2 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------------
select /*+ driving_site(b) */ * from dual@sil a,dual b
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | In
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 4 | 4 (0)| 00:00:01 |
| 1 | MERGE JOIN CARTESIAN| | 1 | 4 | 4 (0)| 00:00:01 |
| 2 | REMOTE | DUAL | 1 | 2 | 2 (0)| 00:00:01 |
| 3 | BUFFER SORT | | 1 | 2 | 2 (0)| 00:00:01 |
| 4 | TABLE ACCESS FULL | DUAL | 1 | 2 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------------
3、qb_name 为查询块自定义名字(QUERY BLOCK )
select /*+ qb_name(testour) */ * from test where name3 is null;
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 2 (100)| |
|* 1 | TABLE ACCESS FULL| TEST | 1 | 106 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - TESTOUR / TEST@TESTOUR
4、ALL_ROWS FIRST_ROWS(n) 指定优化器评估是评估语句执行资源消耗最少还是根据最快返回N行记录的消耗来评估,
注意这种情况FIRST_ROWS(n) 的COST远小于ALL_ROWS,可能导致错误的执行计划。
select /*+ first_rows(1) */ * from testscn;
--------------------------------------------------------------------------------
Plan hash value: 3875681502
-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 105K| 3806K| 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| TESTSCN | 105K| 3806K| 2 (0)| 00:00:01 |
-----------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL1/TESTSCN@SEL1
select /*+ all_rows */ * from testscn;
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3875681502
-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 105K| 3806K| 103 (1)| 00:00:02 |
| 1 | TABLE ACCESS FULL| TESTSCN | 105K| 3806K| 103 (1)| 00:00:02 |
-----------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL1/TESTSCN@SEL1
5、full 针对单表进行全表扫描
select /*+ full(testscn) */ * from testscn;
--------------------------------------------------------------------------------
Plan hash value: 3875681502
-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 105K| 3806K| 103 (1)| 00:00:02 |
| 1 | TABLE ACCESS FULL| TESTSCN | 105K| 3806K| 103 (1)| 00:00:02 |
-----------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL1/TESTSCN@SEL1
6、INDEX 针对单表,考虑使用索引。方式如下四种:
使用索引testscn的TESTSCN_INDEX
select /*+ index(testscn TESTSCN_INDEX ) */ * from testscn where id is not null and name is not null;
考虑testscn上的所有索引,考虑COST最低的或者INDEX链接操作等
select /*+ index(testscn) */ * from testscn where id is not null and name is not null;
考虑testscn上的TESTSCN_INDEX 和TESTSCN_INDEX2 所以,考虑COST最低的或者INDEX链接操作等
select /*+ index(testscn TESTSCN_INDEX testscn_index2 ) */ * from testscn where id is not null and name is not null;
考虑testscn上id和name列的索引,考虑COST最低的或者INDEX链接操作等
select /*+ index(testscn (id) (name) ) */ * from testscn where id is not null and name is not null;
--------------------------------------------------------------------------------
Plan hash value: 3572127329
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 105K| 3806K| 583 (1
|* 1 | TABLE ACCESS BY INDEX ROWID| TESTSCN | 105K| 3806K| 583 (1
|* 2 | INDEX FULL SCAN | TESTSCN_INDEX | 105K| | 224 (1
--------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL1/TESTSCN@SEL1
2 - SEL1/TESTSCN@SEL1
7、NO_INDEX针对单表,考虑不会用指定索引
不使用索引TESTSCN_INDEX,但是使用testscn_index2索引
select /*+ no_index(testscn TESTSCN_INDEX) index(testscn testscn_index2 ) */ * from testscn where id=2 and name is not null;
不使用索引TESTSCN_INDEX,TESTSCN_INDEX2索引
select /*+ no_index(testscn TESTSCN_INDEX TESTSCN_INDEX2) */ * from testscn where id=2 and name is not null;
不使用testscn表上所有索引
select /*+ no_index(testscn) */ * from testscn where id=2 and name is not null;
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1122084783
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CP
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 148 | 627 (
|* 1 | TABLE ACCESS BY INDEX ROWID| TESTSCN | 4 | 148 | 627 (
|* 2 | INDEX FULL SCAN | TESTSCN_INDEX2 | 105K| | 268 (
--------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL1/TESTSCN@SEL1
2 - SEL1/TESTSCN@SEL1
8、INDEX_DESC针对单表,与索引相反的方式进行扫描(升序为降序,降序为升序)
不使用索引TESTSCN_INDEX,但是使用testscn_index2索引,并且扫描testscn_index2为降序
select /*+ no_index(testscn TESTSCN_INDEX) index_DESC(testscn testscn_index2 ) */ * from testscn where id=2 and name is not null;
考虑testscn上的所有索引,考虑COST最低的或者INDEX链接操作等
select /*+ index_DESC(testscn) */ * from testscn where id is not null and name is not null;
考虑testscn上的TESTSCN_INDEX 和TESTSCN_INDEX2 所以,考虑COST最低的或者INDEX链接操作等,并且扫描为降序
select /*+ index_DESC(testscn TESTSCN_INDEX testscn_index2 ) */ * from testscn where id is not null and name is not null;
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3045085307
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CP
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 148 | 627 (
|* 1 | TABLE ACCESS BY INDEX ROWID| TESTSCN | 4 | 148 | 627 (
|* 2 | INDEX FULL SCAN DESCENDING| TESTSCN_INDEX2 | 105K| | 268 (
--------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL1/TESTSCN@SEL1
2 - SEL1/TESTSCN@SEL1
9、INDEX_COMBINE 针对单个目标,让优化器对多个索引进行位图布尔运算,然后进行转化为ROWID,一般这样的执行计划代价较大
可以考虑更改
_b_tree_bitmap_plans为FALSE 来禁用B-TREE索引进行COMBINE转换操作
指定表TESTSCN上的TESTSCN_INDEX,TESTSCN_INDEX2进行COMBINE操作
select /*+ index_combine(testscn TESTSCN_INDEX TESTSCN_INDEX2) */ * from testscn where id=2 and name='gaopeng'
指定表TESTSCN上的所有索引考虑进行COMBINE操作
select /*+ index_combine(testscn ) */ * from testscn where id=2 and name='gaopeng'
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2845944253
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 21 | 26
| 1 | TABLE ACCESS BY INDEX ROWID | TESTSCN | 1 | 21 | 26
| 2 | BITMAP CONVERSION TO ROWIDS | | | |
| 3 | BITMAP AND | | | |
| 4 | BITMAP CONVERSION FROM ROWIDS| | | |
|* 5 | INDEX RANGE SCAN | TESTSCN_INDEX | | |
| 6 | BITMAP CONVERSION FROM ROWIDS| | | |
|* 7 | INDEX RANGE SCAN | TESTSCN_INDEX2 | | | 26
--------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL1/TESTSCN@SEL1
10、INDEX_JOIN 针对单表,当通过多个索引扫描可以得到所有的查询内容和WHERE谓词条件及不需要回表操作。
select /*+ index_join(testscn TESTSCN_INDEX TESTSCN_INDEX2) */ id,name from testscn where id=2 and name='gaopeng';
select /*+ index_join(testscn) */ id,name from testscn where id=2 and name='gaopeng';
具体解释和前面一致
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 782341378
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Tim
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 269 (1)| 00:
|* 1 | VIEW | indexjoin_001 | 1 | 13 | 269 (1)| 00:
|* 2 | HASH JOIN | | | | |
|* 3 | INDEX RANGE SCAN| TESTSCN_INDEX | 1 | 13 | 1 (0)| 00:
|* 4 | INDEX RANGE SCAN| TESTSCN_INDEX2 | 1 | 13 | 268 (1)| 00:
--------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL2AEE34FF/TESTSCN@SEL1
2 - SEL2AEE34FF3−SEL2AEE34FF / indexjoinalias_001@SEL2AEE34FF4−SEL2AEE34FF / indexjoinalias_002@SEL2AEE34FF11、ANDEQUAL针对单表,其成立条件为WHERE条件中有针对不同列的单值条件,并且这些列上都有单值索引,其最大个数为5select/∗+ANDEQUAL(testscnTESTSCNINDEXTESTSCNINDEX2)∗/∗fromtestscnwhereid=2andname=′gaopeng′具体解释和前面一致PLANTABLEOUTPUT−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−Planhashvalue:1514933407−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|Id|Operation|Name|Rows|Bytes|Cost(−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|0|SELECTSTATEMENT||1|21|269(|∗1|TABLEACCESSBYINDEXROWID|TESTSCN|1|21|269(|2|AND−EQUAL|||||∗3|INDEXRANGESCAN|TESTSCNINDEX|1||1(|∗4|INDEXRANGESCAN|TESTSCNINDEX2|99991||267(−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−QueryBlockName/ObjectAlias(identifiedbyoperationid):−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−1−SEL1 / TESTSCN@SEL13−SEL1 / TESTSCN@SEL1如果我们使用ID列上的联合索引:CREATEINDEXTESTSCNINDEX3ONTESTSCN(ID,DEPT);然后select/∗+ANDEQUAL(testscnTESTSCNINDEX3TESTSCNINDEX2)∗/∗fromtestscnwhereid=2andname=′gaopeng′;具体解释和前面一致其执行计划为:PLANTABLEOUTPUT−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−Planhashvalue:9349066−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|Id|Operation|Name|Rows|Bytes|Cost(−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|0|SELECTSTATEMENT||1|21|2(0|∗1|TABLEACCESSBYINDEXROWID|TESTSCN|1|21|2(0|∗2|INDEXRANGESCAN|TESTSCNINDEX|1||1(0−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−QueryBlockName/ObjectAlias(identifiedbyoperationid):−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−1−SEL1 / TESTSCN@SEL12−SEL1 / TESTSCN@SEL1可以看到ANDEQUAL不能生效。因为(并且这些列上都有单值索引)条件不符合。12、INDEXFFS针对单表,当索引中包含了所有查询内容和WHERE谓词条件,不需要回表可以使用。select/∗+INDEXFFS(testscnTESTSCNINDEX3TESTSCNINDEX2)∗/id,deptfromtestscnwhereid=2anddept=′gaopeng′;select/∗+INDEXFFS(testscnTESTSCNINDEX3)∗/id,deptfromtestscnwhereid=2anddept=′gaopeng′;select/∗+INDEXFFS(testscn)∗/id,deptfromtestscnwhereid=2anddept=′gaopeng′;具体解释和前面一致PLANTABLEOUTPUT−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−Planhashvalue:72126314−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|Id|Operation|Name|Rows|Bytes|Cost(−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|0|SELECTSTATEMENT||1|13|93(2)|00:|∗1|INDEXFASTFULLSCAN|TESTSCNINDEX3|1|13|93(2)|00:−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−QueryBlockName/ObjectAlias(identifiedbyoperationid):−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−1−SEL1 / TESTSCN@SEL113、ordered针对多个表进行连接的HINT,他会按照FROM后的顺序,第一表作为驱动结果集。select/∗+ordered∗/∗fromdept1d,dept2b,emp1ewhereb.deptno=e.deptnoande.deptno=d.deptno;PLANTABLEOUTPUT−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−Planhashvalue:3516109060−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|Id|Operation|Name|Rows|Bytes|Cost(−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|0|SELECTSTATEMENT||14|2058|13(8)|00:00:01||∗1|HASHJOIN||14|2058|13(8)|00:00:01||2|MERGEJOINCARTESIAN||16|960|9(0)|00:00:01||3|TABLEACCESSFULL|DEPT1|4|120|3(0)|00:00:01||4|BUFFERSORT||4|120|6(0)|00:00:01||5|TABLEACCESSFULL|DEPT2|4|120|2(0)|00:00:01||6|TABLEACCESSFULL|EMP1|14|1218|3(0)|00:00:01|−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−QueryBlockName/ObjectAlias(identifiedbyoperationid):−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−1−SEL1
3 - SEL1/D@SEL1
5 - SEL1/B@SEL1
14、leading 针对多个表进行连接的HINT,强制LEADING中的表至左向右,第一个为驱动表,如果未在LEADING中出现由ORACLE自动判断。
select /*+ leading (b d )*/ * from dept1 d,dept2 b,emp1 e where b.deptno=e.deptno and e.deptno=d.deptno ;
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 2058 | 13 (8)| 00:00:01 |
|* 1 | HASH JOIN | | 14 | 2058 | 13 (8)| 00:00:01 |
| 2 | MERGE JOIN CARTESIAN| | 16 | 960 | 9 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL | DEPT2 | 4 | 120 | 3 (0)| 00:00:01 |
| 4 | BUFFER SORT | | 4 | 120 | 6 (0)| 00:00:01 |
| 5 | TABLE ACCESS FULL | DEPT1 | 4 | 120 | 2 (0)| 00:00:01 |
| 6 | TABLE ACCESS FULL | EMP1 | 14 | 1218 | 3 (0)| 00:00:01 |
-------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL13−SEL1 / B@SEL15−SEL1 / D@SEL115、usemerge针对多个目标表,指定一个或者多个表为被驱动表select/∗+leading(b)usemerge(de)∗/∗fromdept1d,dept2b,emp1ewhereb.deptno=e.deptnoande.deptno=d.deptno;Planhashvalue:2466184505−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|Id|Operation|Name|Rows|Bytes|Cost(−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|0|SELECTSTATEMENT||14|2058|12(25)|00:00:01||1|MERGEJOIN||14|2058|12(25)|00:00:01||2|MERGEJOIN||14|1638|8(25)|00:00:01||3|SORTJOIN||4|120|4(25)|00:00:01||4|TABLEACCESSFULL|DEPT2|4|120|3(0)|00:00:01||∗5|SORTJOIN||14|1218|4(25)|00:00:01||6|TABLEACCESSFULL|EMP1|14|1218|3(0)|00:00:01||∗7|SORTJOIN||4|120|4(25)|00:00:01||8|TABLEACCESSFULL|DEPT1|4|120|3(0)|00:00:01|−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−QueryBlockName/ObjectAlias(identifiedbyoperationid):−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−1−SEL1
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
4 - SEL1/B@SEL1
6 - SEL1/E@SEL1
8 - SEL1/D@SEL1
16、no_use_merge:针对多个目标表,指定多个被驱动表不能使用MERGE JION
select /*+ leading(dept) no_use_merge(emp) */ * from dept,emp where emp.deptno=dept.deptno;
17、USE_NL:针对多个目标表,指定一个或者多个表为被驱动表,当USE_NL有多个表的时候ORACLE自动选择连接顺序
select /*+ leading (e b) use_nl(d)*/ * from dept1 d,dept2 b,emp1 e where b.deptno=e.deptno and e.deptno=d.deptno
select /*+ leading (e ) use_nl(b d)*/ * from dept1 d,dept2 b,emp1 e where b.deptno=e.deptno and e.deptno=d.deptno
SQL> select * from table(dbms_xplan.display(null,null,' advanced'));
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value: 111324804
-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 1092 | 24 (5)| 00:00:01 |
| 1 | NESTED LOOPS | | 14 | 1092 | 24 (5)| 00:00:01 |
|* 2 | HASH JOIN | | 14 | 812 | 7 (15)| 00:00:01 |
| 3 | TABLE ACCESS FULL| EMP1 | 14 | 532 | 3 (0)| 00:00:01 |
| 4 | TABLE ACCESS FULL| DEPT2 | 4 | 80 | 3 (0)| 00:00:01 |
|* 5 | TABLE ACCESS FULL | DEPT1 | 1 | 20 | 1 (0)| 00:00:01 |
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL13−SEL1 / E@SEL14−SEL1 / B@SEL15−SEL1 / D@SEL118、NOUSENL:针对多个目标表,指定多个被驱动表不能使用NESTLOOP连接方式select/∗+leading(emp)nousenl(dept)∗/∗fromemp,deptwhereemp.deptno=dept.deptnoandempno=7369;19、usehash:针对多个目标表,指定一个或者多个表为被驱动表,当USEHASH有多个表的时候ORACLE自动选择连接顺序select/∗+leading(emp)usehash(dept)∗/∗fromemp,deptwhereemp.deptno=dept.deptno;select/∗+leading(emp)usehash(dept1dept)∗/∗fromemp,dept,DEPT1whereemp.deptno=dept.deptnoandemp.deptno=dept1.deptno;PLANTABLEOUTPUT−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−Planhashvalue:1123238657−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|Id|Operation|Name|Rows|Bytes|Cost(−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|0|SELECTSTATEMENT||14|812|7(15)|00:00:01||∗1|HASHJOIN||14|812|7(15)|00:00:01||2|TABLEACCESSFULL|EMP|14|532|3(0)|00:00:01||3|TABLEACCESSFULL|DEPT|4|80|3(0)|00:00:01|−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−PLANTABLEOUTPUT−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−QueryBlockName/ObjectAlias(identifiedbyoperationid):−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−1−SEL1
2 - SEL1/EMP@SEL1
3 - SEL1/DEPT@SEL1
20、NO_USE_HASH:针对多个目标表,指定多个被驱动表不能使用hash join 连接方式
select /*+ no_use_hash(emp) */ * from emp,dept where emp.deptno=dept.deptno ;
21、use_conact:针对目标SQL的HINT,让优化器对目标SQL使用IN-LIST扩展或者OR扩展
alter session set events '10142 trace name context forever';
alter session set events '10157 trace name context forever';
select /*+ use_concat */ * from emp where empno in (7654,7698);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2259546459
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Tim
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2 | 76 | 2 (0)| 00:
| 1 | CONCATENATION | | | | |
| 2 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 38 | 1 (0)| 00:
|* 3 | INDEX UNIQUE SCAN | PK_EMP | 1 | | 0 (0)| 00:
| 4 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 38 | 1 (0)| 00:
|* 5 | INDEX UNIQUE SCAN | PK_EMP | 1 | | 0 (0)| 00:
--------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL12−SEL1_1 / EMP@SEL13−SEL1_1 / EMP@SEL14−SEL1_2 / EMP@SEL12PLANTABLEOUTPUT−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−5−SEL1_2 / EMP@SEL1222、noexpand:针对目标SQL的HINT,让优化器对目标SQL不使用IN−LIST扩展或者OR扩展,是USECONCAT的反义SQL>explainplanforselect/∗+noexpand∗/∗fromempwhereempnoin(7654,7698);ExplainedSQL>select∗fromtable(dbmsxplan.display(null,null,′advanced′));PLANTABLEOUTPUT−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−Planhashvalue:3202029772−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|Id|Operation|Name|Rows|Bytes|Cost(−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|0|SELECTSTATEMENT||2|76|2(0)||1|TABLEACCESSBYINDEXROWID|EMP|2|76|2(0)||2|BITMAPCONVERSIONTOROWIDS||||||3|BITMAPOR||||||4|BITMAPCONVERSIONFROMROWIDS||||||∗5|INDEXRANGESCAN|PKEMP|||0(0)||6|BITMAPCONVERSIONFROMROWIDS||||||∗7|INDEXRANGESCAN|PKEMP|||0(0)|−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−QueryBlockName/ObjectAlias(identifiedbyoperationid):−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−1−SEL1 / EMP@SEL123、nomerge:针对单个目标视图的HINT,让优化器不使用视图合并select∗fromemp,(select/∗+nomerge∗/∗fromdeptwhereloc=′CHICAGO′)deptviewinlinewhereemp.deptno=deptviewinline.deptno;PLANTABLEOUTPUT−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−Planhashvalue:2910064727−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|Id|Operation|Name|Rows|Bytes|Cost(−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|0|SELECTSTATEMENT||5|340|7(15)|00:00:01||∗1|HASHJOIN||5|340|7(15)|00:00:01||2|VIEW||1|30|3(0)|00:00:01||∗3|TABLEACCESSFULL|DEPT|1|20|3(0)|00:00:01||4|TABLEACCESSFULL|EMP|14|532|3(0)|00:00:01|−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−QueryBlockName/ObjectAlias(identifiedbyoperationid):−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−1−SEL1
2 - SEL2/DEPTVIEWINLINE@SEL1
3 - SEL2/DEPT@SEL2
4 - SEL1/EMP@SEL1
24、
no_merge:针对单个目标视图的HINT,让优化器使用视图合并
select *
from emp,
(select /*+ merge */
*
from dept
where loc = 'CHICAGO') dept_view_inline
where emp.deptno = dept_view_inline.deptno;
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 844388907
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Ti
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5 | 290 | 6 (17)| 00
| 1 | MERGE JOIN | | 5 | 290 | 6 (17)| 00
|* 2 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 20 | 2 (0)| 00
| 3 | INDEX FULL SCAN | PK_DEPT | 4 | | 1 (0)| 00
|* 4 | SORT JOIN | | 14 | 532 | 4 (25)| 00
| 5 | TABLE ACCESS FULL | EMP | 14 | 532 | 3 (0)| 00
--------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SELF5BB74E12−SELF5BB74E1 / DEPT@SEL23−SELF5BB74E1 / DEPT@SEL25−SELF5BB74E1 / EMP@SEL125、nounnest针对子查询的HINT,不让优化器使用子查询展开操作select∗fromempwheredeptnonotin(select/∗+nounnest∗/deptnofromdeptwhereloc=′CHICAGO′);PLANTABLEOUTPUT−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−Planhashvalue:1499841400−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|Id|Operation|Name|Rows|Bytes|Cost(−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−|0|SELECTSTATEMENT||9|342|12(0)|00:00:01||∗1|FILTER|||||||2|TABLEACCESSFULL|EMP|14|532|3(0)|00:00:01||∗3|TABLEACCESSFULL|DEPT|1|11|3(0)|00:00:01|−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−QueryBlockName/ObjectAlias(identifiedbyoperationid):−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−1−SEL1
2 - SEL1/EMP@SEL1
3 - SEL2/DEPT@SEL2
26、unnest 针对子查询的HINT,让优化器使用子查询展开操作
select *
from emp
where deptno not in (select /*+ unnest */
deptno
from dept
where loc = 'CHICAGO');
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3248063469
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 9 | 441 | 7 (15)| 00:00:01 |
|* 1 | HASH JOIN ANTI SNA| | 9 | 441 | 7 (15)| 00:00:01 |
| 2 | TABLE ACCESS FULL| EMP | 14 | 532 | 3 (0)| 00:00:01 |
|* 3 | TABLE ACCESS FULL| DEPT | 1 | 11 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL5DA710D32−SEL5DA710D3 / EMP@SEL13−SEL5DA710D3 / DEPT@SEL$2