子查询中不加Hint
select * from t t1 where OWNER in (select OWNER from t t2 where object_id=100);
Execution Plan
----------------------------------------------------------
Plan hash value: 3356110324
-----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 21019 | 4864K| 197 (13)| 00:00:01 |
| 1 | NESTED LOOPS | | 21019 | 4864K| 197 (13)| 00:00:01 |
| 2 | TABLE ACCESS BY INDEX ROWID| T | 1 | 30 | 2 (0)| 00:00:01 |
|* 3 | INDEX UNIQUE SCAN | IND_T_ID | 1 | | 1 (0)| 00:00:01 |
|* 4 | TABLE ACCESS STORAGE FULL | T | 21019 | 4248K| 195 (13)| 00:00:01 |
-----------------------------------------------------------------------------------------
子查询中错误的使用Hint
select /*+ full(t1) full(t2) */* from t t1 where OWNER in (select OWNER from t t2 where object_id=100);
Execution Plan
----------------------------------------------------------
Plan hash value: 3356110324
-----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 21019 | 4864K| 197 (13)| 00:00:01 |
| 1 | NESTED LOOPS | | 21019 | 4864K| 197 (13)| 00:00:01 |
| 2 | TABLE ACCESS BY INDEX ROWID| T | 1 | 30 | 2 (0)| 00:00:01 |
|* 3 | INDEX UNIQUE SCAN | IND_T_ID | 1 | | 1 (0)| 00:00:01 |
|* 4 | TABLE ACCESS STORAGE FULL | T | 21019 | 4248K| 195 (13)| 00:00:01 |
-----------------------------------------------------------------------------------------
select /*+ full(t2) full(t1) */* from t t1 where OWNER in (select OWNER from t t2 where object_id=100);
Execution Plan
----------------------------------------------------------
Plan hash value: 3356110324
-----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 21019 | 4864K| 197 (13)| 00:00:01 |
| 1 | NESTED LOOPS | | 21019 | 4864K| 197 (13)| 00:00:01 |
| 2 | TABLE ACCESS BY INDEX ROWID| T | 1 | 30 | 2 (0)| 00:00:01 |
|* 3 | INDEX UNIQUE SCAN | IND_T_ID | 1 | | 1 (0)| 00:00:01 |
|* 4 | TABLE ACCESS STORAGE FULL | T | 21019 | 4248K| 195 (13)| 00:00:01 |
-----------------------------------------------------------------------------------------
子查询中使用Hint 方式1
select /*+ full(t1) */* from t t1 where OWNER in (select /*+ full(t2) */OWNER from t t2 where object_id=100);
Execution Plan
----------------------------------------------------------
Plan hash value: 2135975663
-----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 128M| 28G| 1690 (80)| 00:00:06 |
|* 1 | HASH JOIN | | 128M| 28G| 1690 (80)| 00:00:06 |
|* 2 | TABLE ACCESS STORAGE FULL| T | 6097 | 178K| 190 (11)| 00:00:01 |
| 3 | TABLE ACCESS STORAGE FULL| T | 483K| 95M| 195 (13)| 00:00:01 |
-----------------------------------------------------------------------------------
select * from t t1 where OWNER in (select /*+ full(t2) */OWNER from t t2 where object_id=100);
Execution Plan
----------------------------------------------------------
Plan hash value: 2135975663
-----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 128M| 28G| 1690 (80)| 00:00:06 |
|* 1 | HASH JOIN | | 128M| 28G| 1690 (80)| 00:00:06 |
|* 2 | TABLE ACCESS STORAGE FULL| T | 6097 | 178K| 190 (11)| 00:00:01 |
| 3 | TABLE ACCESS STORAGE FULL| T | 483K| 95M| 195 (13)| 00:00:01 |
-----------------------------------------------------------------------------------
子查询中使用Hint 方式2
select /*+ full(@sel$1 t1) full(@sel$2 t2) */* from t t1 where OWNER in (select OWNER from t t2 where object_id=100);
Execution Plan
----------------------------------------------------------
Plan hash value: 2135975663
-----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 128M| 28G| 1690 (80)| 00:00:06 |
|* 1 | HASH JOIN | | 128M| 28G| 1690 (80)| 00:00:06 |
|* 2 | TABLE ACCESS STORAGE FULL| T | 6097 | 178K| 190 (11)| 00:00:01 |
| 3 | TABLE ACCESS STORAGE FULL| T | 483K| 95M| 195 (13)| 00:00:01 |
-----------------------------------------------------------------------------------
select /*+ full(@sel$2 t2) */* from t t1 where OWNER in (select OWNER from t t2 where object_id=100);
Execution Plan
----------------------------------------------------------
Plan hash value: 2135975663
-----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 128M| 28G| 1690 (80)| 00:00:06 |
|* 1 | HASH JOIN | | 128M| 28G| 1690 (80)| 00:00:06 |
|* 2 | TABLE ACCESS STORAGE FULL| T | 6097 | 178K| 190 (11)| 00:00:01 |
| 3 | TABLE ACCESS STORAGE FULL| T | 483K| 95M| 195 (13)| 00:00:01 |
-----------------------------------------------------------------------------------
子查询中使用Hint 方式3
select /*+ full(t1@sel$1) full(t2@sel$2) */* from t t1 where OWNER in (select OWNER from t t2 where object_id=100);
Execution Plan
----------------------------------------------------------
Plan hash value: 2135975663
-----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 128M| 28G| 1690 (80)| 00:00:06 |
|* 1 | HASH JOIN | | 128M| 28G| 1690 (80)| 00:00:06 |
|* 2 | TABLE ACCESS STORAGE FULL| T | 6097 | 178K| 190 (11)| 00:00:01 |
| 3 | TABLE ACCESS STORAGE FULL| T | 483K| 95M| 195 (13)| 00:00:01 |
-----------------------------------------------------------------------------------
select /*+ full(t2@sel$2) */* from t t1 where OWNER in (select OWNER from t t2 where object_id=100);
Execution Plan
----------------------------------------------------------
Plan hash value: 2135975663
-----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 128M| 28G| 1690 (80)| 00:00:06 |
|* 1 | HASH JOIN | | 128M| 28G| 1690 (80)| 00:00:06 |
|* 2 | TABLE ACCESS STORAGE FULL| T | 6097 | 178K| 190 (11)| 00:00:01 |
| 3 | TABLE ACCESS STORAGE FULL| T | 483K| 95M| 195 (13)| 00:00:01 |
-----------------------------------------------------------------------------------
子查询中使用Hint full + 自定义子查询块的名称 Hint qb_name
select /*+ full(@sel$1 t1) full(@zylong t2) */* from t t1 where OWNER in (select /*+ qb_name(zylong) */OWNER from t t2 where object_id=100);
Execution Plan
----------------------------------------------------------
Plan hash value: 2135975663
-----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 128M| 28G| 1690 (80)| 00:00:06 |
|* 1 | HASH JOIN | | 128M| 28G| 1690 (80)| 00:00:06 |
|* 2 | TABLE ACCESS STORAGE FULL| T | 6097 | 178K| 190 (11)| 00:00:01 |
| 3 | TABLE ACCESS STORAGE FULL| T | 483K| 95M| 195 (13)| 00:00:01 |
-----------------------------------------------------------------------------------
select /*+ full(t1@sel$1) full(t2@zylong) */* from t t1 where OWNER in (select /*+ qb_name(zylong) */OWNER from t t2 where object_id=100);
Execution Plan
----------------------------------------------------------
Plan hash value: 2135975663
-----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 128M| 28G| 1690 (80)| 00:00:06 |
|* 1 | HASH JOIN | | 128M| 28G| 1690 (80)| 00:00:06 |
|* 2 | TABLE ACCESS STORAGE FULL| T | 6097 | 178K| 190 (11)| 00:00:01 |
| 3 | TABLE ACCESS STORAGE FULL| T | 483K| 95M| 195 (13)| 00:00:01 |
-----------------------------------------------------------------------------------
扩展知识1
set autotrace off
select owner,object_name,object_id from t t1 where OWNER in (select OWNER from t t2 where object_id=100);
select * from table(dbms_xplan.display_cursor(null,null,'advanced'));
PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------
SQL_ID 5h3n2uv5jujdn, child number 0
-------------------------------------
select owner,object_name,object_id from t t1 where OWNER in (select
OWNER from t t2 where object_id=100)
Plan hash value: 3356110324
-----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 186 (100)| |
| 1 | NESTED LOOPS | | 21019 | 2586K| 186 (8)| 00:00:01 |
| 2 | TABLE ACCESS BY INDEX ROWID| T | 1 | 30 | 2 (0)| 00:00:01 |
|* 3 | INDEX UNIQUE SCAN | IND_T_ID | 1 | | 1 (0)| 00:00:01 |
|* 4 | TABLE ACCESS STORAGE FULL | T | 21019 | 1970K| 184 (8)| 00:00:01 |
-----------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$5DA710D3
2 - SEL$5DA710D3 / T2@SEL$2
3 - SEL$5DA710D3 / T2@SEL$2
4 - SEL$5DA710D3 / T1@SEL$1
Outline Data
-------------
/*+
BEGIN_OUTLINE_DATA
IGNORE_OPTIM_EMBEDDED_HINTS
OPTIMIZER_FEATURES_ENABLE('11.2.0.3')
DB_VERSION('11.2.0.3')
OPT_PARAM('_gby_hash_aggregation_enabled' 'false')
ALL_ROWS
OUTLINE_LEAF(@"SEL$5DA710D3")
UNNEST(@"SEL$2")
OUTLINE(@"SEL$1")
OUTLINE(@"SEL$2")
INDEX_RS_ASC(@"SEL$5DA710D3" "T2"@"SEL$2" ("T"."OBJECT_ID"))
FULL(@"SEL$5DA710D3" "T1"@"SEL$1")
LEADING(@"SEL$5DA710D3" "T2"@"SEL$2" "T1"@"SEL$1")
USE_NL(@"SEL$5DA710D3" "T1"@"SEL$1")
END_OUTLINE_DATA
*/
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("OBJECT_ID"=100)
4 - storage("OWNER"="OWNER")
filter("OWNER"="OWNER")
Column Projection Information (identified by operation id):
-----------------------------------------------------------
1 - "OWNER"[VARCHAR2,30], "OBJECT_NAME"[VARCHAR2,128], "OBJECT_ID"[NUMBER,22]
2 - "OWNER"[VARCHAR2,30]
3 - "T2".ROWID[ROWID,10]
4 - "OWNER"[VARCHAR2,30], "OBJECT_NAME"[VARCHAR2,128], "OBJECT_ID"[NUMBER,22]
Note
-----
- dynamic sampling used for this statement (level=2)
扩展知识2
隐含参数 _OPTIMIZER_IGNORE_HINTS 值设置为TRUE,Oracle会忽略SQL文本中的所有Hint,可以在系统或session级别设置
alter session set "_optimizer_ignore_hints" = true;
如果不想在系统级别设置上诉隐含参数,可以使用如下的 DATABASE TRIGGER 来将其影响范围缩小到session级别
create or replace trigger ignore_hints_on_logon
after logon on database
begin
execute immediate 'alter session set "_optimizer_ignore_hints" = true';
end;
/