zoukankan      html  css  js  c++  java
  • USE_HASH

    use_hash(table1,table2) 指定table1,table2连接以HASH 方式连接,采用这种方式,我们不能控制table1,table2哪个表为驱动表,

    优化器会根据cost自动选择驱动表,如果我们非要控制table1为驱动表,可以加上leading(table1)作为提示,或者用ordered 作为提示。

    另外如果我们使用use_hash(table1)有可能优化器不会选择hash join,也就是说如果不把表名写完整,优化器可能不会强制使用hint提示,这种行为我不是很理解,不过却给了我一个提示:Hint有时候也会失效,另外也给了我一个提示,使用hint一定要将条件写完整

    下面是实验过程

    SQL> select /*+ use_hash(emp)  */ ename,dept.deptno from emp,dept where dept.deptno=emp.deptno;

    已选择14行。


    执行计划
    ----------------------------------------------------------
    Plan hash value: 3074306753

    ------------------------------------------------------------------------------
    | Id  | Operation          | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
    ------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |         |    14 |   168 |     3   (0)| 00:00:01 |
    |   1 |  NESTED LOOPS      |         |    14 |   168 |     3   (0)| 00:00:01 |
    |   2 |   TABLE ACCESS FULL| EMP     |    14 |   126 |     3   (0)| 00:00:01 |
    |*  3 |   INDEX UNIQUE SCAN| PK_DEPT |     1 |     3 |     0   (0)| 00:00:01 |
    ------------------------------------------------------------------------------

    可能是我的写法有问题,难道非要像这样写use_hash(emp,dept)

    SQL> select /*+ use_hash(emp,dept)  */ ename,dept.deptno from emp,dept where dept.deptno=emp.deptno;

    已选择14行。


    执行计划
    ----------------------------------------------------------
    Plan hash value: 71037407

    ------------------------------------------------------------------------------
    | Id  | Operation          | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
    ------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |         |    14 |   168 |     5  (20)| 00:00:01 |
    |*  1 |  HASH JOIN         |         |    14 |   168 |     5  (20)| 00:00:01 |
    |   2 |   INDEX FULL SCAN  | PK_DEPT |     4 |    12 |     1   (0)| 00:00:01 |
    |   3 |   TABLE ACCESS FULL| EMP     |    14 |   126 |     3   (0)| 00:00:01 |
    ------------------------------------------------------------------------------

    究竟是我的写法有问题 还是优化器会自己控制呢?这里给了俺提示,以后用提示 还是写完整比较好

    从执行计划可以看出dept作为驱动表,如果我想要用emp作为驱动表,可以使用leading,ordered提示

    SQL> select /*+ ordered use_hash(emp,dept)  */ ename,dept.deptno from emp,dept where dept.deptno=emp.deptno;

    已选择14行。


    执行计划
    ----------------------------------------------------------
    Plan hash value: 3422444315

    ------------------------------------------------------------------------------
    | Id  | Operation          | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
    ------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |         |    14 |   168 |     5  (20)| 00:00:01 |
    |*  1 |  HASH JOIN         |         |    14 |   168 |     5  (20)| 00:00:01 |
    |   2 |   TABLE ACCESS FULL| EMP     |    14 |   126 |     3   (0)| 00:00:01 |
    |   3 |   INDEX FULL SCAN  | PK_DEPT |     4 |    12 |     1   (0)| 00:00:01 |
    ------------------------------------------------------------------------------

    还可以这样写

    SQL> select /*+ leading(emp) use_hash(emp,dept)  */ ename,dept.deptno from dept,emp where dept.deptno=emp.deptno;

    已选择14行。


    执行计划
    ----------------------------------------------------------
    Plan hash value: 3422444315

    ------------------------------------------------------------------------------
    | Id  | Operation          | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
    ------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |         |    14 |   168 |     5  (20)| 00:00:01 |
    |*  1 |  HASH JOIN         |         |    14 |   168 |     5  (20)| 00:00:01 |
    |   2 |   TABLE ACCESS FULL| EMP     |    14 |   126 |     3   (0)| 00:00:01 |
    |   3 |   INDEX FULL SCAN  | PK_DEPT |     4 |    12 |     1   (0)| 00:00:01 |
    ------------------------------------------------------------------------------

  • 相关阅读:
    Springboot 之 自定义配置文件及读取配置文件
    SQLSERVER系统视图 sql server系统表详细说明
    MySQL Workbench建表时 PK NN UQ BIN UN ZF AI 的含义
    使用Ecplise git commit时出现"There are no stages files"
    maven添加sqlserver的jdbc驱动包
    java将XML文档转换成json格式数据
    java将XML文档转换成json格式数据
    cannot be resolved. It is indirectly referenced from required .class files
    org.codehaus.jackson.map.JsonMappingException: Can not construct instance of java.util.Date from String value '2012-12-12 12:01:01': not a valid representation (error: Can not parse date "2012-12-
    @Autowired注解和静态方法 NoClassDefFoundError could not initialize class 静态类
  • 原文地址:https://www.cnblogs.com/hehe520/p/6330659.html
Copyright © 2011-2022 走看看