Oracle中如何优化connect by语句
Oracle中如何优化connect by语句,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
执行SQL:
SELECTA.CI,A.ENBAJ02ASCELL_NAMEFROMTDL_CM_CELLA,T_ORG_CELL_SCOPESWHERES.REGION_NAME=A.REGION_NAMEANDS.CITY_NAME=A.CITY_NAMEAND(S.ORG_ID)IN(SELECTIDFROMT_ORGOSTARTWITHID=101021003--1010210--STARTWITHID=1CONNECTBYPARENT_ID=PRIORID)
实际使用的执行计划:
而不会采用自适应计划(adaptive plan):
PlanHashValue:2596385940-------------------------------------------------------------------------------------------------------------------|Id|Operation|Name|Rows|Bytes|Cost|Time|-------------------------------------------------------------------------------------------------------------------|0|SELECTSTATEMENT||2622|228114|227|00:00:01||1|NESTEDLOOPS||2622|228114|227|00:00:01||2|NESTEDLOOPS||2622|228114|227|00:00:01||*3|HASHJOIN||1|31|7|00:00:01||4|VIEW|VW_NSO_1|1|13|4|00:00:01||5|HASHUNIQUE||1|20|4|00:00:01||*6|CONNECTBYNOFILTERINGWITHSW(UNIQUE)|||||||7|TABLEACCESSFULL|T_ORG|75|825|3|00:00:01||8|TABLEACCESSFULL|T_ORG_CELL_SCOPE|85|1530|3|00:00:01||*9|INDEXRANGESCAN|IDX_TDL_CM_CELL_SCOPE|257||8|00:00:01||10|TABLEACCESSBYINDEXROWID|TDL_CM_CELL|2313|129528|220|00:00:01|-------------------------------------------------------------------------------------------------------------------PredicateInformation(identifiedbyoperationid):------------------------------------------*3-access("S"."ORG_ID"="ID")*6-access("PARENT_ID"=PRIOR"ID")*6-filter("ID"=101021003)*9-access("S"."REGION_NAME"="A"."REGION_NAME"AND"S"."CITY_NAME"="A"."CITY_NAME")Notes------Thisisanadaptiveplan
原因在于,oracle无法知道connect by之后的数量,所以只能认为是很大的量
--
有一种方式就是,就是使用提示来解决:
SELECT/*+no_merge(x)use_nl(ax)*/A.CI,A.ENBAJ02ASCELL_NAMEFROMTDL_CM_CELLA,(selects.city_name,s.region_namefromT_ORG_CELL_SCOPESWHERE(S.ORG_ID)IN(SELECTIDFROMT_ORGOSTARTWITHID=101021003--1010210--STARTWITHID=1CONNECTBYPARENT_ID=PRIORID))xwherex.REGION_NAME=A.REGION_NAMEANDx.CITY_NAME=A.CITY_NAME
这样计划就是:
PlanHashValue:37846894---------------------------------------------------------------------------------------------------------------------|Id|Operation|Name|Rows|Bytes|Cost|Time|---------------------------------------------------------------------------------------------------------------------|0|SELECTSTATEMENT||2313|277560|227|00:00:01||1|NESTEDLOOPS||2313|277560|227|00:00:01||2|NESTEDLOOPS||2313|277560|227|00:00:01||3|VIEW||1|64|7|00:00:01||*4|HASHJOIN||1|31|7|00:00:01||5|VIEW|VW_NSO_1|1|13|4|00:00:01||6|HASHUNIQUE||1|20|4|00:00:01||*7|CONNECTBYNOFILTERINGWITHSW(UNIQUE)|||||||8|TABLEACCESSFULL|T_ORG|75|825|3|00:00:01||9|TABLEACCESSFULL|T_ORG_CELL_SCOPE|85|1530|3|00:00:01||*10|INDEXRANGESCAN|IDX_TDL_CM_CELL_SCOPE|257||8|00:00:01||11|TABLEACCESSBYINDEXROWID|TDL_CM_CELL|2313|129528|220|00:00:01|---------------------------------------------------------------------------------------------------------------------PredicateInformation(identifiedbyoperationid):------------------------------------------*4-access("S"."ORG_ID"="ID")*7-access("PARENT_ID"=PRIOR"ID")*7-filter("ID"=101021003)*10-access("X"."REGION_NAME"="A"."REGION_NAME"AND"X"."CITY_NAME"="A"."CITY_NAME")
关于Oracle中如何优化connect by语句问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。