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