Hint学习_02_Hint在子查询中

子查询中不加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;
/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值