Oracle 樹(shù)查詢 性能優(yōu)化紀(jì)實(shí)(start with, connect by) |
發(fā)布時(shí)間: 2012/8/21 17:00:06 |
在項(xiàng)目中做權(quán)限控制時(shí),需要用組織階層來(lái)控制能夠訪問(wèn)的數(shù)據(jù), 組織ID(PK) 上位組織ID 根據(jù)上面的結(jié)構(gòu),使用Oracle的樹(shù)查詢語(yǔ)句(start with和connect by)來(lái)創(chuàng)建SQL語(yǔ)句,如下:
查詢指定組織的直屬下層組織: Sql代碼 1、分析執(zhí)行計(jì)劃,發(fā)現(xiàn)有Full Table,說(shuō)明使用索引失敗,優(yōu)化的方法是對(duì)HIGH_ORG_ID加上索引。 2、雖然只是查詢直屬下層的組織,但是上面SQL實(shí)際執(zhí)行時(shí),先查詢出指定組織的所有下層組織, 然后再?gòu)慕Y(jié)果里過(guò)濾出直屬下層的組織(where (level - 1) = 1)。 上面的分析可以得到證明,因?yàn)檩斎氲箶?shù)第二層組織的執(zhí)行時(shí)間會(huì)比輸入最上層組織的執(zhí)行時(shí)間少的多。 優(yōu)化方法是增加connect by語(yǔ)句的條件(and (level - 1) <= 1),不滿足條件的子樹(shù)不會(huì)被查詢,會(huì)省去很多沒(méi)用的遞歸查詢。 Sql代碼 方法一:查詢出A的所有下層組織,看其中是否有B; 方法二:查詢出B的所有上層組織,看其中是否有A。 只要你頭腦里自己描繪出一個(gè)樹(shù)型的組織結(jié)構(gòu),那么你自然會(huì)想到方法二的執(zhí)行速度會(huì)明顯比方法一塊, 方法二是逆行查詢,查到的數(shù)據(jù)量小。 本文出自:億恩科技【www.riomediacenter.com】
查詢指定組織的直屬下層組織: Sql代碼 1、分析執(zhí)行計(jì)劃,發(fā)現(xiàn)有Full Table,說(shuō)明使用索引失敗,優(yōu)化的方法是對(duì)HIGH_ORG_ID加上索引。 2、雖然只是查詢直屬下層的組織,但是上面SQL實(shí)際執(zhí)行時(shí),先查詢出指定組織的所有下層組織, 然后再?gòu)慕Y(jié)果里過(guò)濾出直屬下層的組織(where (level - 1) = 1)。 上面的分析可以得到證明,因?yàn)檩斎氲箶?shù)第二層組織的執(zhí)行時(shí)間會(huì)比輸入最上層組織的執(zhí)行時(shí)間少的多。 優(yōu)化方法是增加connect by語(yǔ)句的條件(and (level - 1) <= 1),不滿足條件的子樹(shù)不會(huì)被查詢,會(huì)省去很多沒(méi)用的遞歸查詢。 Sql代碼 方法一:查詢出A的所有下層組織,看其中是否有B; 方法二:查詢出B的所有上層組織,看其中是否有A。 只要你頭腦里自己描繪出一個(gè)樹(shù)型的組織結(jié)構(gòu),那么你自然會(huì)想到方法二的執(zhí)行速度會(huì)明顯比方法一塊, 方法二是逆行查詢,查到的數(shù)據(jù)量小。 本文出自:億恩科技【www.enidc.com】 --> 服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |