Oracle中connect by语句的优化

时间:2017-11-15 11:45

Tech Neo技术沙龙 | 11月25号,九州云/ZStack与您一起探讨云时代网络边界管理实践

Oracle中connect by语句的优化

很多应用中都会有类似组织机构的表,组织机构的表又通常是典型的层次结构(没有循环节点)。于是通过组织控制数据权限的时候,许多人都喜欢通过connect by获得组织信息,然后再过滤目标数据。

在有些情况下,这样写并没有什么问题,但有些情况下,这个就是一个大问题。

归根结底,这是connect by特性导致的,Oracle无法知道connect by之后到底返回多少数据,所以有可能采取一些你所不期望的算法,结果自然不是你所期望的---非常慢。

下面,我就讨论在Oracle 12.1.0.2中如果遇到这样的语句应该如何处理。

为了很好理解,我做了3表:

执行SQL:

SELECT A.CI, A.ENBAJ02 AS CELL_NAME 

  FROM TDL_CM_CELL A, T_ORG_CELL_SCOPE S 

 WHERE S.REGION_NAME = A.REGION_NAME 

  AND S.CITY_NAME = A.CITY_NAME 

  AND (S.ORG_ID) IN (SELECT ID 

                        FROM T_ORG O 

                      START WITH ID = 101021003 --1010210   

                      --START WITH ID=1 

                      CONNECT BY PARENT_ID = PRIOR ID) 

实际使用的执行计划:

Oracle中connect by语句的优化

而不会采用自适应计划(adaptive plan):

 Plan Hash Value  : 2596385940  

 

------------------------------------------------------------------------------------------------------------------- 

| Id  | Operation                                       | Name                  | Rows | Bytes  | Cost | Time     | 

------------------------------------------------------------------------------------------------------------------- 

|   0 | SELECT STATEMENT                                |                       | 2622 | 228114 |  227 | 00:00:01 | 

|   1 |   NESTED LOOPS                                  |                       | 2622 | 228114 |  227 | 00:00:01 | 

|   2 |    NESTED LOOPS                                 |                       | 2622 | 228114 |  227 | 00:00:01 |