zoukankan      html  css  js  c++  java
  • oracle hints

    oracle hints

        今天是2013-10-08,对于oracle hint有很多,具体可以参考联机手册:

    http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements006.htm#BABIJGJF

    http://docs.oracle.com/cd/E11882_01/server.112/e41573/hintsref.htm#PFGRF501

    刚刚开始,我进行hash join连接发现如下:

    SQL> select /*+use_hash(emp)*/ empno from emp,dept where dept.deptno=emp.deptno;
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 716400937
    
    -----------------------------------------------------------------------------------
    | Id  | Operation         | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
    -----------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |               |    14 |   140 |     1   (0)| 00:00:01 |
    |   1 |  NESTED LOOPS     |               |    14 |   140 |     1   (0)| 00:00:01 |
    |   2 |   INDEX FULL SCAN | IND_EMP       |    14 |    98 |     1   (0)| 00:00:01 |
    |*  3 |   INDEX RANGE SCAN| REVERSE_INDEX |     1 |     3 |     0   (0)| 00:00:01 |
    -----------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       3 - access("DEPT"."DEPTNO"="EMP"."DEPTNO")
    
    SQL> 


    我明明指定的是emp做为驱动表然后进行hash join,但是不行,需要指定另个表,但是use_hash不能规定优化器来选择驱动表。

    eg:

    SQL> select /*+use_hash(emp,dept)*/ empno from emp,dept where dept.deptno=emp.deptno;
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 2255485930
    
    ----------------------------------------------------------------------------------
    | Id  | Operation        | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT |               |    14 |   140 |     2   (0)| 00:00:01 |
    |*  1 |  HASH JOIN       |               |    14 |   140 |     2   (0)| 00:00:01 |
    |   2 |   INDEX FULL SCAN| REVERSE_INDEX |     4 |    12 |     1   (0)| 00:00:01 |
    |   3 |   INDEX FULL SCAN| IND_EMP       |    14 |    98 |     1   (0)| 00:00:01 |
    ----------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       1 - access("DEPT"."DEPTNO"="EMP"."DEPTNO")
    
    SQL> select /*+use_hash(dept,emp)*/ empno from dept,emp where dept.deptno=emp.deptno;
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 2255485930
    
    ----------------------------------------------------------------------------------
    | Id  | Operation        | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT |               |    14 |   140 |     2   (0)| 00:00:01 |
    |*  1 |  HASH JOIN       |               |    14 |   140 |     2   (0)| 00:00:01 |
    |   2 |   INDEX FULL SCAN| REVERSE_INDEX |     4 |    12 |     1   (0)| 00:00:01 |
    |   3 |   INDEX FULL SCAN| IND_EMP       |    14 |    98 |     1   (0)| 00:00:01 |
    ----------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       1 - access("DEPT"."DEPTNO"="EMP"."DEPTNO")
    
    SQL> 


    我们可以选择使用ordered或是leading来指定optimizer选择哪个表为驱动表。

    note:

    The LEADING hint instructs the optimizer to use the specified set of tables as the prefix in the execution plan. This hint is more versatile than the ORDERED hint.

    The LEADING hint is ignored if the tables specified cannot be joined first in the order specified because of dependencies in the join graph. If you specify two or more conflicting LEADING hints, then all of them are ignored. If you specify the ORDERED hint, it overrides all LEADING hints.

    The ORDERED hint instructs Oracle to join tables in the order in which they appear in the FROM clause. Oracle recommends that you use the LEADING hint, which is more versatile than the ORDERED hint.

    When you omit the ORDERED hint from a SQL statement requiring a join, the optimizer chooses the order in which to join the tables. You might want to use the ORDERED hint to specify a join order if you know something that the optimizer does not know about the number of rows selected from each table. Such information lets you choose an inner and outer table better than the optimizer could.

    eg:

    SQL> select /*+leading(emp) use_hash(dept,emp)*/ empno from dept ,emp where dept.deptno=emp.deptno;
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 929644576
    
    ----------------------------------------------------------------------------------
    | Id  | Operation        | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT |               |    14 |   140 |     2   (0)| 00:00:01 |
    |*  1 |  HASH JOIN       |               |    14 |   140 |     2   (0)| 00:00:01 |
    |   2 |   INDEX FULL SCAN| IND_EMP       |    14 |    98 |     1   (0)| 00:00:01 |
    |   3 |   INDEX FULL SCAN| REVERSE_INDEX |     4 |    12 |     1   (0)| 00:00:01 |
    ----------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       1 - access("DEPT"."DEPTNO"="EMP"."DEPTNO")
    
    SQL> select /*+leading(dept) use_hash(dept,emp)*/ empno from dept ,emp where dept.deptno=emp.deptno;
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 2255485930
    
    ----------------------------------------------------------------------------------
    | Id  | Operation        | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT |               |    14 |   140 |     2   (0)| 00:00:01 |
    |*  1 |  HASH JOIN       |               |    14 |   140 |     2   (0)| 00:00:01 |
    |   2 |   INDEX FULL SCAN| REVERSE_INDEX |     4 |    12 |     1   (0)| 00:00:01 |
    |   3 |   INDEX FULL SCAN| IND_EMP       |    14 |    98 |     1   (0)| 00:00:01 |
    ----------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       1 - access("DEPT"."DEPTNO"="EMP"."DEPTNO")
    
    SQL> 


     

    SQL> select /*+ordered use_hash(emp,dept)*/ empno from emp,dept where emp.deptno=dept.deptno;
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 929644576
    
    ----------------------------------------------------------------------------------
    | Id  | Operation        | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT |               |    14 |   140 |     2   (0)| 00:00:01 |
    |*  1 |  HASH JOIN       |               |    14 |   140 |     2   (0)| 00:00:01 |
    |   2 |   INDEX FULL SCAN| IND_EMP       |    14 |    98 |     1   (0)| 00:00:01 |
    |   3 |   INDEX FULL SCAN| REVERSE_INDEX |     4 |    12 |     1   (0)| 00:00:01 |
    ----------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       1 - access("EMP"."DEPTNO"="DEPT"."DEPTNO")
    
    SQL> select /*+ordered use_hash(emp,dept)*/ empno from dept,emp  where emp.deptno=dept.deptno;
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 2255485930
    
    ----------------------------------------------------------------------------------
    | Id  | Operation        | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT |               |    14 |   140 |     2   (0)| 00:00:01 |
    |*  1 |  HASH JOIN       |               |    14 |   140 |     2   (0)| 00:00:01 |
    |   2 |   INDEX FULL SCAN| REVERSE_INDEX |     4 |    12 |     1   (0)| 00:00:01 |
    |   3 |   INDEX FULL SCAN| IND_EMP       |    14 |    98 |     1   (0)| 00:00:01 |
    ----------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       1 - access("EMP"."DEPTNO"="DEPT"."DEPTNO")
    
    SQL> 


     

  • 相关阅读:
    001-分布式理论-CAP定理
    006-优化web请求二-应用缓存、异步调用【Future、ListenableFuture、CompletableFuture】、ETag、WebSocket【SockJS、Stomp】
    003-RFC关于媒体类型说明
    005-优化web请求一-gzip压缩、http缓存控制和缓存校验[Pragma、Expires、Cache-Control、max-age、Last-Modified、用户刷新访问、避免过度304]
    004-restful应用构建、分布式会话、测试工具简介
    003-JSR303校验
    【Java】Callable,Runnable比较及用法
    Ubuntu下迁移MySQL数据库文件目录
    解决linux分区提示doesn't contain a valid partition table
    腾讯云Ubuntu挂载硬盘空间
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3358118.html
Copyright © 2011-2022 走看看