如果我们使用Oracle Security(RLS)隐藏一些记录--是否有任何性能影响--它会减慢我的SQL查询吗?,用于此的Oracle包是: DBMS_RLS。
我计划在某些表中添加:IS_历史性=T/F。然后使用RLS隐藏具有IS_HISTORICAL=T值的记录。
我们在应用程序中使用的SQL查询非常复杂,包括内部/外部连接、子查询、相关子查询等。
在这200多个表中,大约有50个表将应用此RLS策略(通过IS_HISTORICAL=T隐藏记录)。150个表的其余部分是这50个表的子表,因此RLS是隐式的。
有许可证含义吗?
谢谢。
发布于 2013-02-19 09:18:05
“是否存在任何性能影响--它会减慢我的SQL查询速度吗?”
与所有与性能有关的问题一样,答案是“视情况而定”。RLS的工作方式是将受控查询包装在外部查询中,该查询将策略函数作为WHERE子句.
select /*+ rls query */ * from (
select /*+ your query */ ... from t23
where whatever = 42 )
where rls_policy.function_t23 = 'true'因此,性能的影响完全取决于函数中的内容。
做这些事情的正常方法是使用上下文命名空间。这些是通过SYS_CONTEXT()函数访问的会话内存的预定义区域。因此,从上下文检索存储值的成本可以忽略不计。而且,正如我们通常会在每个会话中填充一次名称空间--例如,通过一个后登录触发器或类似的连接钩子--每个查询的总体成本是微不足道的。刷新命名空间有不同的方法,这些方法可能对性能有影响,但在总体布局(see this other answer)中,这些方法也是微不足道的。
因此,性能影响取决于您的功能实际执行的是什么。因此,我们要考虑一下你们的实际政策:
“此RLS策略(通过IS_HISTORICAL=T隐藏记录)”
好消息是,执行这样一项职能本身不太可能代价高昂。坏消息是,这场表演可能仍然是德萨克!无论如何,如果活记录和历史记录的比率是不利的。您可能最终会检索所有记录,然后过滤掉历史记录。优化器可能会将RLS谓词推到主查询中,但我认为这不太可能,因为RLS的工作方式:它避免向一般凝视(这使调试RLS操作成为真正的PITN)揭示策略的标准。
您的用户将为您糟糕的设计决策付出代价。最好有日志表或历史表来存储旧记录,并且只在真实的表中保存实时数据。将历史记录与活记录同时保存很少是一种规模更大的解决方案。
“有许可证的含义吗?”
DBMS_RLS需要企业版许可证。
https://stackoverflow.com/questions/14953270
复制相似问题