首页 > 数据库 > Oracle > CONNECT BY PRIOR语句优化案例
计划执行步骤:
1、Id 9 通过条件"C"."AUTHID"=:B1 走的C表的IDX_UCP_ROLEPUTAUTH_AMID索引对C表进行查询
2、Id 10以C表查出来的ROLEID列及STAFFID列遍历D表主键索引PK_UCP_STAFFROLE,找出符合"C"."ROLEID"="D"."ROLEID" AND "D"."STAFFID"=:B2条件的数据
3、Id 6 "B"."STAFFID"=:B1 AND "B"."AUTHID"=:B1 条件走B表主键索引PK_T_UCP_PUTAUTH获得符合条件的数据并与通过第2步中的结果集做union all
4、Id 3 对表A异列连接后的结果通过第3步获得的结果筛选出所需结果集
5、Id 1 通过外层where条件对第4步获得的结果集进行筛选获得最终结果集
分析:
1、由于逻辑问题无法将最外层谓语条件改写到内层
2、SQL语句对表A是先connect with 再通过exists条件进行筛选,是否可以先筛选后连接?
SELECT *
FROM (SELECT DISTINCT
A.AUTHID,A.AUTHCODE,A.SUPERCODE,A.AUTHNAME,A.MENUFLAG,A.DESCRIPTION,A.MODULEID,A.REGION,A.CREATOR,A.CREATEORG,
A.ISPUBLIC,A.CREATEDATE,A.STATUS,A.STATUSDATE,A.CREATETYPE,A.RIGHTGROUP,A.DISPLAYNO,A.SYSTEMID
FROM A
CONNECT BY PRIOR A.SUPERCODE = A.AUTHCODE
START WITH EXISTS(select 1 from (SELECT B.AUTHID FROM B WHERE B.STAFFID = :B1
UNION ALL
SELECT C.AUTHID FROM C, D WHERE C.ROLEID = D.ROLEID AND D.STAFFID = :B2)
where A.AUTHID = AUTHID) )
WHERE 1 = 1
AND (INSTR(SYSTEMID, :B3) > 0 OR SYSTEMID IS
NULL) AND SUPERCODE = :B4 AND MODULEID <> 'ESOP_WEB' AND
MODULEID <> 'CMOP_WEB'
ORDER BY DISPLAYNO, SUPERCODE, AUTHCODE;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31345818/viewspace-2130199/ ,如需转载,请注明出处,否则将追究法律责任。