mysql树状查询效率_Oracle树查询性能优化纪实
(startwith,connectby)
在项⽬中做权限控制时,需要⽤组织阶层来控制能够访问的数据,⽐如A组织的⼈可以看到其下属组织的⼈员数据,或者只有A组织是B组织
mysql语句转oracle在项⽬中做权限控制时,需要⽤组织阶层来控制能够访问的数据,
⽐如A组织的⼈可以看到其下属组织的⼈员数据,或者只有A组织是B组织上级的时候才有看B组织⼈员数据的权利。
根据需求需要构筑DB的表结构,如下(ORG_RANK)
组织ID(PK) 上位组织ID
ORG_ID HIGH_ORG_ID
根据上⾯的结构,使⽤Oracle的树查询语句(start with和connect by)来创建SQL语句,如下:
查询指定组织的直属下层组织:
Sql代码
学生信息管理系统界面select ORANK.ORG_ID
from ORG_RANK ORANK
where ( level - 1) = 1
计算机二级c语言真题2022start with ORANK.ORG_ID = #orgId#
connect by prior ORANK.ORG_ID = ORANK.HIGH_ORG_ID
select ORANK.ORG_ID
from ORG_RANK ORANK
where (level - 1) = 1
start with ORANK.ORG_ID = #orgId#
connect by prior ORANK.ORG_ID = ORANK.HIGH_ORG_ID对以上SQL做性能评定时发现出现严重性能问题,(10层组织,3000条数据时)查询时间1分多钟,下⾯进⾏了优化。
1、分析执⾏计划,发现有Full Table,说明使⽤索引失败,优化的⽅法是对HIGH_ORG_ID加上索引。
2、虽然只是查询直属下层的组织,,但是上⾯SQL实际执⾏时,先查询出指定组织的所有下层组织,
然后再从结果⾥过滤出直属下层的组织(where (level - 1) = 1)。
上⾯的分析可以得到证明,因为输⼊倒数第⼆层组织的执⾏时间会⽐输⼊最上层组织的执⾏时间少的多。
优化⽅法是增加connect by语句的条件(and (level - 1) <= 1),不满⾜条件的⼦树不会被查询,会省去很多没⽤的递归查询。
Sql代码
select ORANK.ORG_ID
ascii码对照表是干嘛的from ORG_RANK ORANK
where ( level - 1) = 1
start with ORANK.ORG_ID = #orgId#
connect by prior ORANK.ORG_ID = ORANK.HIGH_ORG_IDpython菜鸟教程基础
and ( level - 1) <= 1
select ORANK.ORG_ID
富士康最新动态from ORG_RANK ORANK
where (level - 1) = 1
start with ORANK.ORG_ID = #orgId#
connect by prior ORANK.ORG_ID = ORANK.HIGH_ORG_ID
and (level - 1) <= 1判断组织A是组织B的上层组织:
⽅法⼀:查询出A的所有下层组织,看其中是否有B;
⽅法⼆:查询出B的所有上层组织,看其中是否有A。
只要你头脑⾥⾃⼰描绘出⼀个树型的组织结构,那么你⾃然会想到⽅法⼆的执⾏速度会明显⽐⽅法⼀块,⽅法⼆是逆⾏查询,查到的数据量⼩。
本⽂原创发布php中⽂⽹,转载请注明出处,感谢您的尊重!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。