有一个递归查询在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

oracle update exsits,Oracle 11g 递归+ exists执行计划的改变相关推荐

  1. 在Oracle中,如何得到真实的执行计划?

    在Oracle中,如何得到真实的执行计划? Oracle查看执行计划的几种方法:http://blog.itpub.net/26736162/viewspace-2136865/ 一.  如何得到真实 ...

  2. 【DB笔试面试600】在Oracle中,如何获取SQL历史执行计划?

    ♣题目 部分 在Oracle中,如何获取SQL历史执行计划? ♣答案部分 历史执行计划只能从AWR中获取,如果AWR没有记录的话,那么就无法获取历史执行计划了,获取历史执行计划的命令如下所示: 1SE ...

  3. oracle group by 行转列 分析执行计划

    group by 子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句 限制返回的结果集 类似于distinct的去重,可是不明白到底俩区别?功能上grou ...

  4. Oracle收集cbo统计信息,Oracle CBO 统计信息的收集与执行计划的选择

    --概要 主要总结一下Oracle是如何收集统计信息的是如何选择的,有一些好的Ref可以看看 --基本概念 首先要明确系统的自动收集机制 如果insert update delete truncate ...

  5. oracle缓存怎么看,Oracle从缓存里面查找真实的执行计划

    有关Oracle 的执行计划说明,参考:Oracle Explain Plan 有关Oracle 的执行计划说明,参考:Oracle Explain Plan 见 一. 查看当前session 的SI ...

  6. oracle sql 执行计划分析_从Oracle数据库实验来看索引的常见执行计划

    概述 今天主要介绍下Oracle索引的常见执行计划: INDEX FULL SCAN:索引的全扫描,单块读,有序 INDEX RANGE SCAN:索引的范围扫描 INDEX FAST FULL SC ...

  7. oracle update并行,Oracle update 优化方式,tuning update!

    在批量更新中,merge语句性能是最好的,因为merge可以多快读,而且可以启用并行,merge语句比一般update语句快,另外还有一种就是根据rowid来更新,这几种方法更新各有好处,首先使用me ...

  8. oracle update范例,oracle 12c单范例数据库打12.1.0.2.4补丁记录

    当前位置:我的异常网» 数据库 » oracle 12c单范例数据库打12.1.0.2.4补丁记录 oracle 12c单范例数据库打12.1.0.2.4补丁记录 www.myexceptions.n ...

  9. Oracle 查看 SQL执行计划

    Oracle 查看 SQL执行计划 SQL性能分析 执行计划可以用来分析SQL的性能 一.查看执行计划的方法 1. 设置autotrace set autotrace off: 此为默认值,即关闭au ...

最新文章

  1. conrtex 和 ARM 的关系
  2. 茶觉 | “治愈”的白牡丹
  3. UA MATH567 高维统计专题2 Low-rank矩阵及其估计3 Rank RIP
  4. 博通1300亿美元收购高通,一场充满大饼和落井下石的“大戏”
  5. java中随机生成26个字母组合的随机验证码
  6. mysql 分表_MySQL如何分库分表
  7. 后台管理,有无限可能
  8. 微软开源其 C++ 标准库实现 STL
  9. jinja Extends Blocks Include
  10. simpledateformat格式_大厂都是怎么用Java8代替SimpleDateFormat?
  11. el-table固定列之后没有出现滚动条_一道经典的MySQL面试题,答案出现三次反转...
  12. C语言/C++常见字符串函数
  13. 语音识别中的CTC算法的基本原理解释
  14. 8月30日学习内容整理:命名空间,作用域,函数名本质,闭包
  15. 阿里云容器Kubernetes监控(五) - 离线存储与归档Kubernetes事件
  16. java.util.BitSet 研究
  17. [附源码]Java计算机毕业设计SSM歌唱比赛积分管理系统
  18. 南加利福尼亚大学计算机博士,斑马博士|南加州大学(USC) MSc Electronic Engineering (Computer Network)...
  19. 如何转换.CR2格式的图片
  20. 17款迈腾B8L CD数据

热门文章

  1. [FAQ12112]在电池低电压时,如何关闭camera的闪光功能
  2. 1. Arthas的命令
  3. 应用场景是什么?怎样判断、描述一个产品的应用场景?
  4. 计算机的存储器(详解)
  5. 《偏生要鲜花着景,应这急景流年》
  6. 云计算机的一大特征是什么,云计算最大的特征是什么?
  7. GAMMA初学笔记三
  8. MySQL 多表关联修改语句
  9. hbuilder 打包 php,HBuilder 打包流程
  10. 一个年化收益30%的指数