【oracle】leading vs ordered hint

简介: leading hint 可以指示oracle使用leading 中指定的表作为驱动表,比如 正常的访问计划如下SCOTT@yangdb> select e.
leading hint 可以指示oracle使用leading 中指定的表作为驱动表,
比如 正常的访问计划如下
SCOTT@yangdb> select e.ename, hiredate, b.comm
  2   from emp e, bonus b
  3   where e.ename = b.ename;
Execution Plan
----------------------------------------------------------
Plan hash value: 1125985041
----------------------------------------------------------------------------
| Id  | Operation          | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |       |     1 |    34 |     6  (17)| 00:00:01 |
|*  1 |  HASH JOIN         |       |     1 |    34 |     6  (17)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| BONUS |     1 |    20 |     2   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL| EMP   |    14 |   196 |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - access("E"."ENAME"="B"."ENAME")

我们在leading 提示中指定 emp 表为驱动表
SCOTT@yangdb> select /*+ leading(e b) */ e.ename,hiredate,b.comm
  2   from emp e, bonus b
  3   where e.ename = b.ename;
Execution Plan
----------------------------------------------------------
Plan hash value: 1842254584
----------------------------------------------------------------------------
| Id  | Operation          | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |       |     1 |    34 |     6  (17)| 00:00:01 |
|*  1 |  HASH JOIN         |       |     1 |    34 |     6  (17)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| EMP   |    14 |   196 |     3   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL| BONUS |     1 |    20 |     2   (0)| 00:00:01 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - access("E"."ENAME"="B"."ENAME")
如结果执行计划中将emp 作为驱动表!
1 在leading 提示同时使用ordered hint,则leading hint无效
SCOTT@yangdb> select /*+ leading(b e)  ordered */  e.ename,hiredate, b.comm
  2   from emp e, bonus b
  3   where e.ename = b.ename;
Execution Plan
----------------------------------------------------------
Plan hash value: 1842254584
----------------------------------------------------------------------------
| Id  | Operation          | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |       |     1 |    34 |     6  (17)| 00:00:01 |
|*  1 |  HASH JOIN         |       |     1 |    34 |     6  (17)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| EMP   |    14 |   196 |     3   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL| BONUS |     1 |    20 |     2   (0)| 00:00:01 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - access("E"."ENAME"="B"."ENAME")
2 使用两个冲突的leading hint ,则oracle cbo会忽略所有的leading 提示!
SCOTT@yangdb> select /*+ leading(b e) leading(e b) */e.ename,hiredate, b.comm
  2   from emp e, bonus b
  3   where e.ename = b.ename;
Execution Plan
----------------------------------------------------------
Plan hash value: 1125985041
----------------------------------------------------------------------------
| Id  | Operation          | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |       |     1 |    34 |     6  (17)| 00:00:01 |
|*  1 |  HASH JOIN         |       |     1 |    34 |     6  (17)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| BONUS |     1 |    20 |     2   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL| EMP   |    14 |   196 |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - access("E"."ENAME"="B"."ENAME")

odered hint 可以指示oracle 使用from 关键字后面的表的顺序进行join连接!cbo会优先按照from 后面的表的顺序来进行join,当统计信息失效或者不准确的时候,效果会比较差,使用ordered 提示 使cbo优化器忽略解析过程中的表连接评估,从而避免Oracle产生错误的执行计划,或者强制Oracle按照我们指定的方式执行。
SCOTT@yangdb> select /*+ ordered */e.ename,hiredate,b.comm
  2   from emp e,bonus b
  3   where e.ename = b.ename;
Execution Plan
----------------------------------------------------------
Plan hash value: 1842254584
----------------------------------------------------------------------------
| Id  | Operation          | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |       |     1 |    34 |     6  (17)| 00:00:01 |
|*  1 |  HASH JOIN         |       |     1 |    34 |     6  (17)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| EMP   |    14 |   196 |     3   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL| BONUS |     1 |    20 |     2   (0)| 00:00:01 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - access("E"."ENAME"="B"."ENAME")

SCOTT@yangdb> select /*+ ordered(b e)*/e.ename,hiredate,b.comm
  2   from emp e,bonus b
  3   where e.ename = b.ename;
Execution Plan
----------------------------------------------------------
Plan hash value: 1125985041
----------------------------------------------------------------------------
| Id  | Operation          | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |       |     1 |    34 |     6  (17)| 00:00:01 |
|*  1 |  HASH JOIN         |       |     1 |    34 |     6  (17)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| BONUS |     1 |    20 |     2   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL| EMP   |    14 |   196 |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - access("E"."ENAME"="B"."ENAME")

SCOTT@yangdb> 
目录
相关文章
|
SQL 缓存 Oracle
Oracle-绑定变量binding variable解读
Oracle-绑定变量binding variable解读
355 0
|
SQL Oracle 关系型数据库
Enhanced Subquery Optimizations in Oracle
在前面的文章中,介绍了Oracle是如何做cost-based query transformation的,其中也包含Oracle基于rules/cost所做的若干种常见的query rewrite。对于CBQT的极简描述是对一个query做deep copy后,尝试一系列transform并利用physical optimizer计算cost,如果cost更低则保留该变换,否则抛弃。详细介绍可以参考之前的文章。 这篇paper算是之前那篇的后续,把重点放在了对subquery的处理上。subquery是一种在分析型query中非常常见的SQL construct,非常便于表达一些语义因此被
303 0
Enhanced Subquery Optimizations in Oracle
|
SQL Oracle 关系型数据库
ORACLE不可见索引(Invisible Indexes)
不可见索引概念   不可见索引(Invisible Index)是ORACLE 11g引入的新特性。不可见索引是会被优化器忽略的不可见索引,除非在会话或系统级别上将OPTIMIZER_USE_INVISIBLE_INDEXES初始化参数显式设置为TRUE。
1546 0
|
Oracle 关系型数据库 索引
|
Oracle 关系型数据库 索引
|
SQL Oracle 关系型数据库
|
SQL Oracle 关系型数据库
|
SQL Oracle 关系型数据库

热门文章

最新文章

推荐镜像

更多