当前位置:  数据库>oracle

Oracle 11g 递归+ exists执行计划的改变

    来源: 互联网  发布时间:2017-06-11

    本文导语: 有一个递归查询在Oracle 10g上运行很快,但在11g上运行不出来。SQL> select * from v$version;BANNER--------------------------------------------------------------------------------Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit ProductionPL/SQL Release 11.2.0.4.0 -...

有一个递归查询在Oracle 10g上运行很快,但在11g上运行不出来。
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE    11.2.0.4.0      Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production

SQL> set timing on
SQL> set autotrace trace exp;--由于SQL执行出来需要两小时,所以就不执行了
SQL> SELECT *
      FROM (SELECT DISTINCT A.*
              FROM GG_MATERIAL_CLASSIFY A
            CONNECT BY PRIOR PARENT_CLASSIFY_ID = CLASSIFY_ID
              START WITH exists
                        (SELECT DISTINCT M.CLASSIFY_ID
                            FROM GG_DISTRIBUTION D, GG_MATERIAL M
                          WHERE D.MATERIAL_ID = M.MATERIAL_ID
                            AND A.CLASSIFY_ID=M.CLASSIFY_ID
                            AND D.ACTUAL_QTY > 0
                            AND D.DATA_AREA LIKE '03%')) B
      WHERE B.PARENT_CLASSIFY_ID = '201'
      ORDER BY B.CODE ASC;
执行计划
----------------------------------------------------------
Plan hash value: 3402505179
----------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                  | Name                          | Rows  | Bytes | Cost (%CPU)| Time    | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------------------------------------
|  0 | CREATE TABLE STATEMENT                      |                                |    68 | 27608 |  2433  (2)| 00:00:30 |      |      |
|  0 | SELECT STATEMENT                            |                                |    2 |  2174 |    15  (7)| 00:00:01 |      |      |
|  1 |  LOAD AS SELECT                            | A0K_GG_MATERIAL_PAYMENT_140122 |      |      |            |          |      |      |
|  1 |  SORT ORDER BY                              |                                |    2 |  2174 |    15  (7)| 00:00:01 |      |      |
|*  2 |  TABLE ACCESS FULL                        | GG_MATERIAL_PAYMENT            |    68 | 27608 |  2431  (2)| 00:00:30 |      |      |
|*  2 |  VIEW                                      |                                |    2 |  2174 |    15  (7)| 00:00:01 |      |      |
|  3 |    HASH UNIQUE                              |                                |    2 |  412 |    15  (7)| 00:00:01 |      |      |
|*  4 |    CONNECT BY NO FILTERING WITH SW (UNIQUE)|                                |      |      |            |          |      |      |
|  5 |      TABLE ACCESS FULL                      | GG_MATERIAL_CLASSIFY          |  1864 |  262K|    14  (0)| 00:00:01 |      |      |
|*  6 |      HASH JOIN                              |                                |    1 |    65 |  207  (0)| 00:00:03 |      |      |
|  7 |      TABLE ACCESS BY INDEX ROWID          | GG_MATERIAL                    |    72 |  1512 |    24  (0)| 00:00:01 |      |      |
|*  8 |        INDEX RANGE SCAN                    | RELATIONSHIP_84_FK            |    72 |      |    3  (0)| 00:00:01 |      |      |
|*  9 |      TABLE ACCESS BY GLOBAL INDEX ROWID    | GG_DISTRIBUTION                |  1624 | 35728 |  183  (0)| 00:00:03 | ROWID | ROWID |
|* 10 |        INDEX RANGE SCAN                    | IX_DISTRIBU_ACT_QTY01          |  144K|      |    6  (0)| 00:00:01 |      |      |
----------------------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
  2 - filter("GG_MATERIAL_PAYMENT"."PAYMENT_AMOUNT" IS NULL)
  2 - filter("B"."PARENT_CLASSIFY_ID"='201')
  4 - access("CLASSIFY_ID"=PRIOR "PARENT_CLASSIFY_ID")
      filter( EXISTS (SELECT 0 FROM "GG_MATERIAL" "M","GG_DISTRIBUTION" "D" WHERE "D"."ACTUAL_QTY">0 AND "D"."DATA_AREA" LIKE '03%'
              AND "M"."CLASSIFY_ID"=:B1 AND "D"."MATERIAL_ID"="M"."MATERIAL_ID"))
  6 - access("D"."MATERIAL_ID"="M"."MATERIAL_ID")
  8 - access("M"."CLASSIFY_ID"=:B1)
  9 - filter("D"."DATA_AREA" LIKE '03%')
  10 - access("D"."ACTUAL_QTY">0)
--网络上提供的方法1:修改隐含参数
SQL> alter session set "_optimizer_connect_by_elim_dups" = false;
SQL> alter session set "_connect_by_use_union_all" = "old_plan_mode";
SQL> SELECT *
  2        FROM (SELECT DISTINCT A.*
  3                FROM GG_MATERIAL_CLASSIFY A
  4              CONNECT BY PRIOR PARENT_CLASSIFY_ID = CLASSIFY_ID
  5                START WITH exists
  6                          (SELECT DISTINCT M.CLASSIFY_ID
  7                              FROM GG_DISTRIBUTION D, GG_MATERIAL M
  8                            WHERE D.MATERIAL_ID = M.MATERIAL_ID
  9                              AND A.CLASSIFY_ID=M.CLASSIFY_ID
 10                              AND D.ACTUAL_QTY > 0
 11                              AND D.DATA_AREA LIKE '03%')) B
 12        WHERE B.PARENT_CLASSIFY_ID = '201'
 13        ORDER BY B.CODE ASC;
已选择11行。
已用时间:  00: 00: 04.39
执行计划
----------------------------------------------------------
Plan hash value: 3792201725
----------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                | Name                    | Rows  | Bytes |TempSpc| Cost (%CPU)| Time    | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------------------------------------
|  0 | SELECT STATEMENT                          |                          |    1 |  1087 |      |    3  (34)| 00:00:01 |      |      |
|  1 |  SORT ORDER BY                            |                          |    1 |  1087 |      |    3  (34)| 00:00:01 |      |      |
|*  2 |  VIEW                                    |                          |    1 |  1087 |      |    3  (34)| 00:00:01 |      |      |
|  3 |    HASH UNIQUE                            |                          |    1 |  144 |      |    3  (34)| 00:00:01 |      |      |
|*  4 |    CONNECT BY WITH FILTERING            |                          |      |      |      |            |          |      |      |
|  5 |      TABLE ACCESS BY INDEX ROWID          | GG_MATERIAL_CLASSIFY    |      |      |      |            |          |      |      |
|*  6 |      HASH JOIN                          |                          |  114K|  5816K|      | 16615  (1)| 00:03:20 |      |      |
|  7 |        INDEX FAST FULL SCAN              | PK_GG_MATERIAL_CLASSIFY  |  1864 | 16776 |      |    3  (0)| 00:00:01 |      |      |
|*  8 |        HASH JOIN                          |                          |  144K|  6051K|  3784K| 16610  (1)| 00:03:20 |      |      |
|  9 |        INDEX FAST FULL SCAN              | INX_GG_MATERIAL_CLASSIFY |  117K|  2403K|      |  145  (2)| 00:00:02 |      |      |
|* 10 |        TABLE ACCESS BY GLOBAL INDEX ROWID| GG_DISTRIBUTION          |  144K|  3097K|      | 16045  (1)| 00:03:13 | ROWID | ROWID |
|* 11 |          INDEX RANGE SCAN                | IX_DISTRIBU_ACT_QTY01    |  144K|      |      |  346  (1)| 00:00:05 |      |      |
|  12 |      NESTED LOOPS                        |                          |      |      |      |            |          |      |      |
|  13 |      CONNECT BY PUMP                    |                          |      |      |      |            |          |      |      |
|  14 |      TABLE ACCESS BY INDEX ROWID        | GG_MATERIAL_CLASSIFY    |    1 |  144 |      |    2  (0)| 00:00:01 |      |      |
|* 15 |        INDEX UNIQUE SCAN                  | PK_GG_MATERIAL_CLASSIFY  |    1 |      |      |    1  (0)| 00:00:01 |      |      |
----------------------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
  2 - filter("B"."PARENT_CLASSIFY_ID"='201')
  4 - access("CLASSIFY_ID"=PRIOR "PARENT_CLASSIFY_ID")
  6 - access("A"."CLASSIFY_ID"="M"."CLASSIFY_ID")
  8 - access("D"."MATERIAL_ID"="M"."MATERIAL_ID")
  10 - filter("D"."DATA_AREA" LIKE '03%')
  11 - access("D"."ACTUAL_QTY">0)
  15 - access("CLASSIFY_ID"=PRIOR "PARENT_CLASSIFY_ID")
--网络上提供的方法2:失效,执行不出来(注意,要换一个session执行)
SELECT *
      FROM (SELECT /*+ connect_by_filtering */DISTINCT A.*
              FROM GG_MATERIAL_CLASSIFY A
            CONNECT BY PRIOR PARENT_CLASSIFY_ID = CLASSIFY_ID
              START WITH exists
                        (SELECT DISTINCT M.CLASSIFY_ID
                            FROM GG_DISTRIBUTION D, GG_MATERIAL M
                          WHERE D.MATERIAL_ID = M.MATERIAL_ID
                            AND A.CLASSIFY_ID=M.CLASSIFY_ID
                            AND D.ACTUAL_QTY > 0
                            AND D.DATA_AREA LIKE '03%')) B
      WHERE B.PARENT_CLASSIFY_ID = '201'
      ORDER BY B.CODE ASC; 
  对网络的方法总结,最好不要修改隐含参数,最多加上Hint,但Hint失效,所以再去找其他的方法。


  无意之中把exits改为了in,问题解决了。
SQL> set autotrace traceonly
SQL> SELECT *
      FROM (SELECT DISTINCT A.*
              FROM GG_MATERIAL_CLASSIFY A
            CONNECT BY PRIOR PARENT_CLASSIFY_ID = CLASSIFY_ID
            START WITH CLASSIFY_ID IN
                        (SELECT DISTINCT M.CLASSIFY_ID
                          FROM GG_DISTRIBUTION D, GG_MATERIAL M
                          WHERE D.MATERIAL_ID = M.MATERIAL_ID
                            AND D.ACTUAL_QTY > 0
                            AND D.DATA_AREA LIKE '03%')) B
    WHERE B.PARENT_CLASSIFY_ID = '201'
    ORDER BY B.CODE ASC;
已选择11行。
已用时间:  00: 00: 01.00
执行计划
----------------------------------------------------------
Plan hash value: 4133877384
------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                | Name                      | Rows  | Bytes |TempSpc| Cost (%CPU)| Time    | Pstart| Pstop |
------------------------------------------------------------------------------------------------------------------------------------------------
|  0 | CREATE TABLE STATEMENT                    |                            |  645K|    57M|      |  3895  (1)| 00:00:47 |      |      |
|  0 | SELECT STATEMENT                          |                            |  3246 |  3445K|      | 16641  (1)| 00:03:20 |      |      |
|  1 |  LOAD AS SELECT                          | A2K_GG_INVOICE_ITEM_140106 |      |      |      |            |          |      |      |
|  1 |  SORT ORDER BY                            |                            |  3246 |  3445K|      | 16641  (1)| 00:03:20 |      |      |
|  2 |  TABLE ACCESS FULL                      | GG_INVOICE_ITEM            |  645K|    57M|      |  1984  (2)| 00:00:24 |      |      |
|*  2 |  VIEW                                    |                            |  3246 |  3445K|      | 16641  (1)| 00:03:20 |      |      |
|  3 |    HASH UNIQUE                            |                            |  3246 |  653K|      | 16641  (1)| 00:03:20 |      |      |
|*  4 |    CONNECT BY WITHOUT FILTERING (UNIQUE) |                            |      |      |      |            |          |      |      |
|*  5 |      HASH JOIN SEMI                      |                            |  1623 |  256K|      | 16626  (1)| 00:03:20 |      |      |
|  6 |      TABLE ACCESS FULL                  | GG_MATERIAL_CLASSIFY      |  1864 |  262K|      |    14  (0)| 00:00:01 |      |      |
|  7 |      VIEW                                | VW_NSO_1                  |  144K|  2533K|      | 16610  (1)| 00:03:20 |      |      |
|*  8 |        HASH JOIN                          |                            |  144K|  6051K|  3784K| 16610  (1)| 00:03:20 |      |      |
|  9 |        INDEX FAST FULL SCAN              | INX_GG_MATERIAL_CLASSIFY  |  117K|  2403K|      |  145  (2)| 00:00:02 |      |      |
|* 10 |        TABLE ACCESS BY GLOBAL INDEX ROWID| GG_DISTRIBUTION            |  144K|  3097K|      | 16045  (1)| 00:03:13 | ROWID | ROWID |
|* 11 |          INDEX RANGE SCAN                | IX_DISTRIBU_ACT_QTY01      |  144K|      |      |  346  (1)| 00:00:05 |      |      |
|  12 |      TABLE ACCESS FULL                    | GG_MATERIAL_CLASSIFY      |  1864 |  262K|      |    14  (0)| 00:00:01 |      |      |
------------------------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
  2 - filter("B"."PARENT_CLASSIFY_ID"='201')
  4 - access("CLASSIFY_ID"=PRIOR "PARENT_CLASSIFY_ID")
  5 - access("CLASSIFY_ID"="CLASSIFY_ID")
  8 - access("D"."MATERIAL_ID"="M"."MATERIAL_ID")
  10 - filter("D"."DATA_AREA" LIKE '03%')
  11 - access("D"."ACTUAL_QTY">0)
统计信息
----------------------------------------------------------
          0  recursive calls
          0  db block gets
    113928  consistent gets
          0  physical reads
          0  redo size
      1960  bytes sent via SQL*Net to client
        338  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client

  我看了一下in 和 exists产生执行计划的区别,从谓词从看到exists需要没有展开,所以我加了一个Hint验证了一下,执行结果跟in就是一样的了。
--unnest为展开子查询
SQL> SELECT *
  FROM (SELECT DISTINCT A.*
          FROM GG_MATERIAL_CLASSIFY A
        CONNECT BY PRIOR PARENT_CLASSIFY_ID = CLASSIFY_ID
          START WITH exists
                    (SELECT /*+unnest*/DISTINCT M.CLASSIFY_ID
                        FROM GG_DISTRIBUTION D, GG_MATERIAL M
                      WHERE D.MATERIAL_ID = M.MATERIAL_ID
                        AND A.CLASSIFY_ID=M.CLASSIFY_ID
                        AND D.ACTUAL_QTY > 0
                        AND D.DATA_AREA LIKE '03%')) B
  WHERE B.PARENT_CLASSIFY_ID = '201'
  ORDER BY B.CODE ASC;
已选择11行。
已用时间:  00: 00: 01.18
执行计划
----------------------------------------------------------
Plan hash value: 2653190462
----------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                | Name                    | Rows  | Bytes |TempSpc| Cost (%CPU)| Time    | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------------------------------------
|  0 | SELECT STATEMENT                          |                          |  3246 |  3445K|      | 16641  (1)| 00:03:20 |      |      |
|  1 |  SORT ORDER BY                            |                          |  3246 |  3445K|      | 16641  (1)| 00:03:20 |      |      |
|*  2 |  VIEW                                    |                          |  3246 |  3445K|      | 16641  (1)| 00:03:20 |      |      |
|  3 |    HASH UNIQUE                            |                          |  3246 |  653K|      | 16641  (1)| 00:03:20 |      |      |
|*  4 |    CONNECT BY WITHOUT FILTERING (UNIQUE) |                          |      |      |      |            |          |      |      |
|*  5 |      HASH JOIN SEMI                      |                          |  1623 |  256K|      | 16626  (1)| 00:03:20 |      |      |
|  6 |      TABLE ACCESS FULL                  | GG_MATERIAL_CLASSIFY    |  1864 |  262K|      |    14  (0)| 00:00:01 |      |      |
|  7 |      VIEW                                | VW_SQ_1                  |  144K|  2533K|      | 16610  (1)| 00:03:20 |      |      |
|*  8 |        HASH JOIN                          |                          |  144K|  6051K|  3784K| 16610  (1)| 00:03:20 |      |      |
|  9 |        INDEX FAST FULL SCAN              | INX_GG_MATERIAL_CLASSIFY |  117K|  2403K|      |  145  (2)| 00:00:02 |      |      |
|* 10 |        TABLE ACCESS BY GLOBAL INDEX ROWID| GG_DISTRIBUTION          |  144K|  3097K|      | 16045  (1)| 00:03:13 | ROWID | ROWID |
|* 11 |          INDEX RANGE SCAN                | IX_DISTRIBU_ACT_QTY01    |  144K|      |      |  346  (1)| 00:00:05 |      |      |
|  12 |      TABLE ACCESS FULL                    | GG_MATERIAL_CLASSIFY    |  1864 |  262K|      |    14  (0)| 00:00:01 |      |      |
----------------------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
  2 - filter("B"."PARENT_CLASSIFY_ID"='201')
  4 - access("CLASSIFY_ID"=PRIOR "PARENT_CLASSIFY_ID")
  5 - access("A"."CLASSIFY_ID"="ITEM_0")
  8 - access("D"."MATERIAL_ID"="M"."MATERIAL_ID")
  10 - filter("D"."DATA_AREA" LIKE '03%')
  11 - access("D"."ACTUAL_QTY">0)
统计信息
----------------------------------------------------------
          1  recursive calls
          0  db block gets
    113928  consistent gets
          0  physical reads
          0  redo size
      1960  bytes sent via SQL*Net to client
        338  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          3  sorts (memory)
          0  sorts (disk)
        11  rows processed

在CentOS 6.4下安装Oracle 11gR2(x64)

Oracle 11gR2 在VMWare虚拟机中安装步骤

Debian 下 安装 Oracle 11g XE R2

Oracle性能优化 之 共享池


    
 
 

您可能感兴趣的文章:

  • Oracle中的树型递归的应用
  • oracle 使用递归的性能提示测试对比
  • oracle SQL递归的使用详解
  • 深入sql oracle递归查询
  • 怎么写一个Shell来执行这样的功能,访问Oracle数据库,然后执行一个SQL脚本,生成一个文件。急!
  • win2000+jbuilder6+oracle817编出的程序,在win2000下执行很好,在win98下却访问不了oracle数据库
  • oracle 可以在crontab 中定时执行吗?
  • oracle sql执行过程(流程图)
  • linux能够通过执行脚本添加oracle数据库的用户吗
  • ORACLE安装时/tmp/orainstRoot.sh 执行发生错误
  • 求救:HPUNIX下的ORACLE7执行select * from tablename提示权限不足!!
  • 为什么 export ORACLE_SID=test写在程序里面就不会执行?
  • 请问在 Linux 下如何用代码实现连接oracle数据库 并 执行 SQL 语句?
  • shell调用oracle储存过程,怎么判断储存过程执行结果是否正确
  • shell 执行oracle sql脚本的问题
  • oracle单库彻底删除干净的执行步骤
  • 查看Oracle的执行计划一句话命令
  • 关于ORACLE中执行批处理的问题
  • oracle中得到一条SQL语句的执行时间的两种方式
  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • Nagios check_oracle_health 关于执行SQL问题
  • 执行Commit时Oracle做哪些工作
  • RedHat AS 4 安装oracle9i的时候,执行Disk1下的runInstaller后提示正在初始化虚拟机,请等待后就再无反应
  • JBUILDER如何执行ORACLE的储存过程
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 详解如何应用改变跟踪技术加速Oracle递增备份
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE日期相关操作
  • Linux系统下Oracle的启动与Oracle监听的启动
  • ORACLE数据库常用字段数据类型介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • Oracle 12c的九大最新技术特性介绍
  • 移动开发 iis7站长之家


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,