我是靠谱客的博主 年轻果汁,最近开发中收集的这篇文章主要介绍使用Oracle进行机构权限设计时的一次优化,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

业务需求:机构用户只能查询到归属于本机构和下级机构的数据。(此处000为根节点机构代码)
原始SQL:

select * from a_table 
	where belong_org_code  in (
		select org_code   
			from org_table   START WITH org_code = '000' connect by prior org_code = upper_org_code
		)

由于机构信息过多in中的机构信息有一万多条,同时a表中拥有50多万的数据,导致这条sql执行时间13s!
在大神的指点下赶紧抢救!
解决方法:
在a表中添加org_path字段存储机构路径(如:/000/001/012)记录每条信息的机构路径
修改后的SQL

--输出a表中012机构所有同级机构或下级机构数据
select * from a_table where instr(org_path,'/000/001/012') >0

通过下面的SQL即可获得org_path(即类似于:/000/001/012)字符串:

--输出结果/000/001/012
select sys_connect_by_path(org_code,'/') path 
	from org_table  
		where org_code = '012' start with org_code = '000' connect by prior org_code = upper_org_code

然后给org_path建立索引,执行0.21s!
最后:大佬牛逼!

注:在Oracle/PLSQL中,instr函数返回要截取的字符串在源字符串中的位置。只检索一次,也就是说从字符的开始到字符的结尾就结束。

1 select instr('helloworld','l') from dual; --返回结果:3    默认第一次出现“l”的位置
2 select instr('helloworld','lo') from dual; --返回结果:4    即“lo”同时出现,第一个字母“l”出现的位置
3 select instr('helloworld','wo') from dual; --返回结果:6    即“wo”同时出现,第一个字母“w”出现的位置
INSTR方法的格式为
INSTR(src, subStr,startIndex, count)
src: 源字符串
subStr : 要查找的子串
startIndex : 从第几个字符开始。负数表示从右往左查找。
count: 要找到第几个匹配的序号
返回值: 子串在字符串中的位置,第1个为1;不存在为0. (特别注意:如果src为空字符串,返回值为null)。
1: select instr('helloworld','l',2,2) from dual;  --返回结果:4    也就是说:在"helloworld"的第2(e)号位置开始,查找第二次出现的“l”的位置
2: select instr('helloworld','l',3,2) from dual;  --返回结果:4    也就是说:在"helloworld"的第3(l)号位置开始,查找第二次出现的“l”的位置
3: select instr('helloworld','l',4,2) from dual;  --返回结果:9    也就是说:在"helloworld"的第4(l)号位置开始,查找第二次出现的“l”的位置
4: select instr('helloworld','l',-1,1) from dual;  --返回结果:9    也就是说:在"helloworld"的倒数第1(d)号位置开始,往回查找第一次出现的“l”的位置
5: select instr('helloworld','l',-2,2) from dual;  --返回结果:4    也就是说:在"helloworld"的倒数第2(l)号位置开始,往回查找第二次出现的“l”的位置
6: select instr('helloworld','l',2,3) from dual;  --返回结果:9    也就是说:在"helloworld"的第2(e)号位置开始,查找第三次出现的“l”的位置
7: select instr('helloworld','l',-2,3) from dual; --返回结果:3    也就是说:在"helloworld"的倒数第2(l)号位置开始,往回查找第三次出现的“l”的位置

关于instr可参考:https://www.cnblogs.com/itzhoucong/p/11647496.html

最后

以上就是年轻果汁为你收集整理的使用Oracle进行机构权限设计时的一次优化的全部内容,希望文章能够帮你解决使用Oracle进行机构权限设计时的一次优化所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部