Encountered an expensive production sql today, basically it is in the following structure:
select BM.*, V.*
FROM
BMXYZ BM,
VXYZ V,
BBXYZ BB
WHERE
V.BO_ID=BM.BO_ID
AND BM.VOL_PARENT_BO_ID IN(SELECT B.VOL_PARENT_BO_ID
FROM BMXYZ B
START WITH BB.BO_ID=B.VOL_PARENT_BO_ID
CONNECT BY PRIOR B.BO_ID = B.VOL_PARENT_BO_ID )
AND BB.USER_ID='xyzuvw'
AND V.CONTENT_VENDOR_ID='3000000'
;
At the first glance, it seems there are no join conditions involving BB. Finally I was able to understand what the sql tries to do :
(1) obtain a set of BO_ID's from table BB
(2) for each BO_ID in the set, find all child rows of it from the table BM
(3) finally row source from (2) join table V.
After rewriting it as follows, the query run much faster with only hundreds gets:
select BM.*, V.*
FROM
BMXYZ BM,
VXYZ V
WHERE
V.BO_ID=BM.BO_ID
AND BM.VOL_PARENT_BO_ID IN(SELECT B.VOL_PARENT_BO_ID
FROM BMXYZ B, (select bo_id from BBXYZ where user_id='xyzuvw') BB
START WITH BB.BO_ID=B.VOL_PARENT_BO_ID
CONNECT BY PRIOR B.BO_ID = B.VOL_PARENT_BO_ID )
AND V.CONTENT_VENDOR_ID='3000000'
;
No comments:
Post a Comment