首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用(DBMS_RLS) Oracle Security的性能含义?

使用(DBMS_RLS) Oracle Security的性能含义?
EN

Stack Overflow用户
提问于 2013-02-19 08:48:59
回答 1查看 2.8K关注 0票数 0

如果我们使用Oracle Security(RLS)隐藏一些记录--是否有任何性能影响--它会减慢我的SQL查询吗?,用于此的Oracle包是: DBMS_RLS。

我计划在某些表中添加:IS_历史性=T/F。然后使用RLS隐藏具有IS_HISTORICAL=T值的记录。

我们在应用程序中使用的SQL查询非常复杂,包括内部/外部连接、子查询、相关子查询等。

在这200多个表中,大约有50个表将应用此RLS策略(通过IS_HISTORICAL=T隐藏记录)。150个表的其余部分是这50个表的子表,因此RLS是隐式的。

有许可证含义吗?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-19 09:18:05

“是否存在任何性能影响--它会减慢我的SQL查询速度吗?”

与所有与性能有关的问题一样,答案是“视情况而定”。RLS的工作方式是将受控查询包装在外部查询中,该查询将策略函数作为WHERE子句.

代码语言:javascript
复制
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需要企业版许可证。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14953270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档