Oracle 10g上的索引和RLS

时间:2011-10-06 09:05:09

标签: oracle indexing

我的表data1有2个字段: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');

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

create index data3_idx on data (user_ID, data_id);

谢谢,

1 个答案:

答案 0 :(得分:2)

一般来说,为(data_id)(user_id,data_id)(user_id)两列提供三个索引会很浪费,因为Oracle可以对user_id上过滤的查询使用复合索引和筛选两个列的查询。

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