• 禁止CBO进行子查询扩展


    用hint NO_UNNEST 可以禁止CBO 进行 Subquery Unnesting 
    
    hint UNNEST 可以提示CBO进行Subquery Unnesting
    
    
    1.NO_UNNEST
    
    SQL> set linesize 200
    SQL> set pagesize 200
    SQL> explain plan for select count(*) from test o where object_id>(select avg(object_id) from test i where i.object_type=o.object_type);
    
    已解释。
    
    SQL> select * from table(dbms_xplan.display());
    
    PLAN_TABLE_OUTPUT
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Plan hash value: 731730653
    
    ---------------------------------------------------------------------------------
    | Id  | Operation	      | Name	| Rows	| Bytes | Cost (%CPU)| Time	|
    ---------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT      | 	|     1 |    38 |   699   (2)| 00:00:09 |
    |   1 |  SORT AGGREGATE       | 	|     1 |    38 |	     |		|
    |*  2 |   HASH JOIN	      | 	| 53949 |  2002K|   699   (2)| 00:00:09 |
    |   3 |    VIEW 	      | VW_SQ_1 |    45 |  1080 |   350   (2)| 00:00:05 |
    |   4 |     HASH GROUP BY     | 	|    45 |   630 |   350   (2)| 00:00:05 |
    |   5 |      TABLE ACCESS FULL| TEST	| 86974 |  1189K|   347   (1)| 00:00:05 |
    |   6 |    TABLE ACCESS FULL  | TEST	| 86974 |  1189K|   347   (1)| 00:00:05 |
    ---------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       2 - access("ITEM_1"="O"."OBJECT_TYPE")
           filter("OBJECT_ID">"AVG(OBJECT_ID)")
    
    已选择19行。
    
    
    
    
    真实执行计划:
    
    SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL,NULL,'ALLSTATS LAST'));
    
    PLAN_TABLE_OUTPUT
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    SQL_ID	anxr90rp27yn9, child number 0
    -------------------------------------
    select count(*) from test o where object_id>(select avg(object_id) from
    test i where i.object_type=o.object_type)
    
    Plan hash value: 731730653
    
    ----------------------------------------------------------------------------------------------------------------------
    | Id  | Operation	      | Name	| Starts | E-Rows | A-Rows |   A-Time	| Buffers |  OMem |  1Mem | Used-Mem |
    ----------------------------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT      | 	|      1 |	  |	 1 |00:00:01.13 |   39796 |	  |	  |	     |
    |   1 |  SORT AGGREGATE       | 	|      1 |	1 |	 1 |00:00:01.13 |   39796 |	  |	  |	     |
    |*  2 |   HASH JOIN	      | 	|      1 |  53949 |    692K|00:00:01.09 |   39796 |  1229K|  1229K| 1557K (0)|
    |   3 |    VIEW 	      | VW_SQ_1 |      1 |     45 |	45 |00:00:00.49 |   19898 |	  |	  |	     |
    |   4 |     HASH GROUP BY     | 	|      1 |     45 |	45 |00:00:00.49 |   19898 |   123M|    10M| 2522K (0)|
    |   5 |      TABLE ACCESS FULL| TEST	|      1 |  86974 |   1391K|00:00:00.16 |   19898 |	  |	  |	     |
    |   6 |    TABLE ACCESS FULL  | TEST	|      1 |  86974 |   1391K|00:00:00.16 |   19898 |	  |	  |	     |
    ----------------------------------------------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       2 - access("ITEM_1"="O"."OBJECT_TYPE")
           filter("OBJECT_ID">"AVG(OBJECT_ID)")
    
    
    已选择25行。
    
    已用时间:  00: 00: 00.03
    
    
    
    
    执行耗时:
    
    SQL> select count(*) from test o where object_id>(select avg(object_id) from test i where i.object_type=o.object_type);
    
      COUNT(*)
    ----------
        692912
    
    已用时间:  00: 00: 00.54
    
    
    
    禁止cbo进行查询转换:
    
    
    select count(*) from test o where object_id>(select  /*+ NO_UNNEST */ avg(object_id) from test i where i.object_type=o.object_type);
    
    
    SQL> explain plan for 
    select count(*) from test o where object_id>(select  /*+ NO_UNNEST */ avg(object_id) from test i where i.object_type=o.object_type);
      2  
    已解释。
    
    SQL> select * from table(dbms_xplan.display());
    
    PLAN_TABLE_OUTPUT
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Plan hash value: 2139949240
    
    -----------------------------------------------------------------------------
    | Id  | Operation	     | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    -----------------------------------------------------------------------------
    |   0 | SELECT STATEMENT     |	    |	  1 |	 14 | 15960   (1)| 00:03:12 |
    |   1 |  SORT AGGREGATE      |	    |	  1 |	 14 |		 |	    |
    |*  2 |   FILTER	     |	    |	    |	    |		 |	    |
    |   3 |    TABLE ACCESS FULL | TEST | 86974 |  1189K|	347   (1)| 00:00:05 |
    |   4 |    SORT AGGREGATE    |	    |	  1 |	 14 |		 |	    |
    |*  5 |     TABLE ACCESS FULL| TEST |  1933 | 27062 |	347   (1)| 00:00:05 |
    -----------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       2 - filter("OBJECT_ID"> (SELECT /*+ NO_UNNEST */ AVG("OBJECT_ID")
    	      FROM "TEST" "I" WHERE "I"."OBJECT_TYPE"=:B1))
       5 - filter("I"."OBJECT_TYPE"=:B1)
    
    已选择19行。
    
    SQL> 
    select count(*) from test o where object_id>(select  /*+ NO_UNNEST */ avg(object_id) from test i where i.object_type=o.object_type);
    SQL> 
    
      COUNT(*)
    ----------
        692912
    
    已用时间:  00: 00: 18.45
    SQL> SQL>  SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL,NULL,'ALLSTATS LAST'));
    
    PLAN_TABLE_OUTPUT
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    SQL_ID	5hzdf4w2c60sf, child number 0
    -------------------------------------
    select count(*) from test o where object_id>(select  /*+ NO_UNNEST */
    avg(object_id) from test i where i.object_type=o.object_type)
    
    Plan hash value: 2139949240
    
    ---------------------------------------------------------------------------------------
    | Id  | Operation	     | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
    ---------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT     |	    |	   1 |	      |      1 |00:00:18.45 |	 4516K|
    |   1 |  SORT AGGREGATE      |	    |	   1 |	    1 |      1 |00:00:18.45 |	 4516K|
    |*  2 |   FILTER	     |	    |	   1 |	      |    692K|00:00:18.41 |	 4516K|
    |   3 |    TABLE ACCESS FULL | TEST |	   1 |	86974 |   1391K|00:00:00.16 |	19898 |
    |   4 |    SORT AGGREGATE    |	    |	 226 |	    1 |    226 |00:00:17.87 |	 4496K|
    |*  5 |     TABLE ACCESS FULL| TEST |	 226 |	 1933 |   1458K|00:00:17.72 |	 4496K|
    ---------------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       2 - filter("OBJECT_ID">)
       5 - filter("I"."OBJECT_TYPE"=:B1)
    
    
    已选择24行。
    
    已用时间:  00: 00: 00.03
    
  • 相关阅读:
    h5实现 微信的授权登录
    js判断浏览器的环境(pc端,移动端,还是微信浏览器)
    动态判断时间插件显示到年月日时分秒
    H5发起微信支付
    Vue项目结合vux使用
    Swift学习笔记一:常量和变量
    iOS开发之解决系统数字键盘无文字时delete键无法监听的技巧
    Swift3.0之获取设备识别号deviceNo和保存账户AccountId
    Swift3.0之自定义debug阶段控制台打印
    Xcode之command+/快捷键添加注释不起作用
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13348722.html
Copyright © 2020-2023  润新知