记得之前在HP 的时候,遇到一个ROW LEVEL SECURITY 的性能问题,当时也在优快云发了一个博客,不过因为涉及用户信息泄密,所以把博客删除了。最近一个网友也遇到RLS性能问题
……petma19:58:06
我现在遇到一个比较郁闷的问题
……petma19:59:23
是这样的,我们的系统,将用户分为了几类,每一类的权限策略是不一样的,然后数据查询的时候,我们先要调安全的方法,得到一个权限策略的SQL,然后再将这个SQL做为参数,传到真正的数据查询中
……petma19:59:31
可是,加了这个SQL后,就非常慢
落落19:59:53
ROWLEVELSECURITY?
……petma20:00:05
是的
落落20:00:47
哈哈哈我之前遇到过
落落20:00:52
你在外企?
落落20:01:03
这个好办
落落20:01:11
你把RLS的限制条件发一下给我看看
落落20:01:20
是不是限制条件是一个子查询?
……petma20:01:24
是
……petma20:01:37
SELECT*
FROM(SELECTA.*,ROWNUMRN
FROM(
selectb.*fromos_form_baseb,ttwo_wo_infot
where
t.form_id=b.form_id
andsite_codein(
selectresCodefrom(select*from(selectdept_codeasresCode,dept_nameasresNamefromsec_dept)WHERE1!=1OR((1=1andresCodein('0001030102','0001030105','000103010501','00010301050101','000103010502','00010301050201','000103010503','00010301050301','000103010504','00010301050401','000103010505','00010301050501','000103010506','00010301050601','000103010507','00010301050701','000103010508','00010301050801','000103010509','00010301050901','000103010510','00010301051001','000103010511','00010301051101','000103010512','00010301051201','000103010514','0001030109','000103010901','00010301090101','000103010902','00010301090201','000103010903','00010301090301','000103010904','00010301090401','000103010905','00010301090501','000103010906','00010301090601','000103010907','00010301090701','000103010908','000103010909','000103010910','000103010911','00010301091101','00010301091102','00010301091103','00010301091104','000103011906','00010301190601','000103011907','00010301190701'))or(1!=1))andresCodelike'00010301%'))
orderbyt.form_iddesc
)A
WHEREROWNUM<=15
)WHERERN>0
……petma20:01:56
这段用于权限控制
……petma20:02:49
我也用PL/SQLF5看了下,把权限控制里的1!=1这种去掉后,里面的耗费减少了,但是查询时间没变化
落落20:03:03
SQL优化不要去看cost
落落20:03:10
也不要用PL/SQL去看执行计划
……petma20:03:12
哦
落落20:03:23
你在限制条件里面加一个HINT
落落20:03:31
/*+no_unnest*/
落落20:03:33
试一试
……petma20:03:45
这个我不会加,呆会去百度,加了这个之后呢
落落20:03:57
加了再试一试
落落20:04:02
不行再找我
……petma20:04:07
OK,QQQ
落落20:04:12
直接就在SELECT后面加上即可
落落20:04:34
限制条件里面的SELECT后面加
落落20:04:46
而不是在最开始的SELECT那里加小心点哈
……petma20:05:44
wheresite_codein(selectres_code这里面加哈)
落落20:07:50
wheresite_codein(select/*+no_unnest*/res_code这里面加哈)
落落20:07:52
嗯
……petma20:09:10
为什么一下子就非常快了
……petma20:13:28
膜拜
落落20:15:05
我现在遇到一个比较郁闷的问题
……petma19:59:23
是这样的,我们的系统,将用户分为了几类,每一类的权限策略是不一样的,然后数据查询的时候,我们先要调安全的方法,得到一个权限策略的SQL,然后再将这个SQL做为参数,传到真正的数据查询中
……petma19:59:31
可是,加了这个SQL后,就非常慢
落落19:59:53
ROWLEVELSECURITY?
……petma20:00:05
是的
落落20:00:47
哈哈哈我之前遇到过
落落20:00:52
你在外企?
落落20:01:03
这个好办
落落20:01:11
你把RLS的限制条件发一下给我看看
落落20:01:20
是不是限制条件是一个子查询?
……petma20:01:24
是
……petma20:01:37
SELECT*
FROM(SELECTA.*,ROWNUMRN
FROM(
selectb.*fromos_form_baseb,ttwo_wo_infot
where
t.form_id=b.form_id
andsite_codein(
selectresCodefrom(select*from(selectdept_codeasresCode,dept_nameasresNamefromsec_dept)WHERE1!=1OR((1=1andresCodein('0001030102','0001030105','000103010501','00010301050101','000103010502','00010301050201','000103010503','00010301050301','000103010504','00010301050401','000103010505','00010301050501','000103010506','00010301050601','000103010507','00010301050701','000103010508','00010301050801','000103010509','00010301050901','000103010510','00010301051001','000103010511','00010301051101','000103010512','00010301051201','000103010514','0001030109','000103010901','00010301090101','000103010902','00010301090201','000103010903','00010301090301','000103010904','00010301090401','000103010905','00010301090501','000103010906','00010301090601','000103010907','00010301090701','000103010908','000103010909','000103010910','000103010911','00010301091101','00010301091102','00010301091103','00010301091104','000103011906','00010301190601','000103011907','00010301190701'))or(1!=1))andresCodelike'00010301%'))
orderbyt.form_iddesc
)A
WHEREROWNUM<=15
)WHERERN>0
……petma20:01:56
这段用于权限控制
……petma20:02:49
我也用PL/SQLF5看了下,把权限控制里的1!=1这种去掉后,里面的耗费减少了,但是查询时间没变化
落落20:03:03
SQL优化不要去看cost
落落20:03:10
也不要用PL/SQL去看执行计划
……petma20:03:12
哦
落落20:03:23
你在限制条件里面加一个HINT
落落20:03:31
/*+no_unnest*/
落落20:03:33
试一试
……petma20:03:45
这个我不会加,呆会去百度,加了这个之后呢
落落20:03:57
加了再试一试
落落20:04:02
不行再找我
……petma20:04:07
OK,QQQ
落落20:04:12
直接就在SELECT后面加上即可
落落20:04:34
限制条件里面的SELECT后面加
落落20:04:46
而不是在最开始的SELECT那里加小心点哈
……petma20:05:44
wheresite_codein(selectres_code这里面加哈)
落落20:07:50
wheresite_codein(select/*+no_unnest*/res_code这里面加哈)
落落20:07:52
嗯
……petma20:09:10
为什么一下子就非常快了
……petma20:13:28
膜拜
落落20:15:05