| 組織ID(PK) | 上位組織ID |
| ORG_ID | HIGH_ORG_ID |
根據上面的結構,使用Oracle的樹(shù)查詢(xún)語(yǔ)句(start with和connect by)來(lái)創(chuàng )建SQL語(yǔ)句,如下:
查詢(xún)指定組織的直屬下層組織:
select ORANK.ORG_IDfrom ORG_RANK ORANKwhere (level - 1) = 1start with ORANK.ORG_ID = #orgId#connect by prior ORANK.ORG_ID = ORANK.HIGH_ORG_ID
對以上SQL做性能評定時(shí)發(fā)現出現嚴重性能問(wèn)題,(10層組織,3000條數據時(shí))查詢(xún)時(shí)間1分多鐘,下面進(jìn)行了優(yōu)化。
1、分析執行計劃,發(fā)現有Full Table,說(shuō)明使用索引失敗,優(yōu)化的方法是對HIGH_ORG_ID加上索引。
2、雖然只是查詢(xún)直屬下層的組織,但是上面SQL實(shí)際執行時(shí),先查詢(xún)出指定組織的所有下層組織,
然后再從結果里過(guò)濾出直屬下層的組織(where (level - 1) = 1)。
上面的分析可以得到證明,因為輸入倒數第二層組織的執行時(shí)間會(huì )比輸入最上層組織的執行時(shí)間少的多。
優(yōu)化方法是增加connect by語(yǔ)句的條件(and (level - 1) <= 1),不滿(mǎn)足條件的子樹(shù)不會(huì )被查詢(xún),會(huì )省去很多沒(méi)用的遞歸查詢(xún)。
select ORANK.ORG_IDfrom ORG_RANK ORANKwhere (level - 1) = 1start with ORANK.ORG_ID = #orgId#connect by prior ORANK.ORG_ID = ORANK.HIGH_ORG_IDand (level - 1) <= 1
判斷組織A是組織B的上層組織:
方法一:查詢(xún)出A的所有下層組織,看其中是否有B;
方法二:查詢(xún)出B的所有上層組織,看其中是否有A。
只要你頭腦里自己描繪出一個(gè)樹(shù)型的組織結構,那么你自然會(huì )想到方法二的執行速度會(huì )明顯比方法一塊,
方法二是逆行查詢(xún),查到的數據量小。
聯(lián)系客服