【问题标题】:Index and RLS on Oracle 10gOracle 10g 上的索引和 RLS
【发布时间】:2011-10-06 22:32:37
【问题描述】:

我有 2 个字段的表 data1:user_id 和 data_id。我在 user_id 和 data_id 上有 2 个索引。它们是非唯一索引。

一个函数:

FUNCTION user_filter(p_schema IN VARCHAR2,
                                   p_object IN VARCHAR2) RETURN VARCHAR2 IS
  BEGIN
    RETURN 'user_id='||session_pkg.user_id;
  END;

我将此函数注册为 data1 上的 rls 策略:

DBMS_RLS.ADD_POLICY(OBJECT_SCHEMA   => '',
                        OBJECT_NAME     => 'data1',
                        POLICY_NAME     => 'user_filter',
                        POLICY_FUNCTION => 'user_filter');

为了获得最佳性能,我是否必须再创建 1 个索引,如下所示?

create index data3_idx on data (user_ID, data_id);

谢谢,

【问题讨论】:

  • 你的意思是我需要 02 索引:在 (user_id,data_id) 和 data_id 上?有时我们会移除 RLS!

标签: oracle indexing


【解决方案1】:

一般来说,为 (data_id)(user_id,data_id)(user_id) 两列设置三个索引会很浪费,因为 Oracle 可以将复合索引用于过滤 user_id 的查询和过滤两列的查询。

在您的情况下,DBMS_RLS.ADD_POLICY 过程会将过滤器 user_id=XX 添加到此对象的所有请求中。这意味着您可以将data_id 上的索引替换为更高效的复合索引。

【讨论】:

  • 您好 Vincent Malgrat,有时我会删除 RLS。我会保留 2 个索引:(user_id,data_id) 和 (data_id)?
  • 是的,如果有些查询不使用RLS,你需要通过data_id查询你的数据,这两个索引应该没问题。
猜你喜欢
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
相关资源
最近更新 更多