Oracle 10g上的索引和RLS

Oracle 10g上的索引和RLS,oracle,indexing,Oracle,Indexing,我有两个字段:用户id和数据id。我有两个关于用户id和数据id的索引。它们是非唯一索引 功能: 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策略:

我有两个字段:用户id和数据id。我有两个关于用户id和数据id的索引。它们是非唯一索引

功能:

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);

谢谢,

一般来说,为两列
(data\u id)
(user\u id,data\u id)
(user\u id)
使用三个索引是浪费的,因为Oracle可以使用复合索引来过滤
用户id
的查询和过滤两列的查询


在您的情况下,
DBMS\u RLS.ADD\u POLICY
过程会将过滤器
user\u id=XX
添加到此对象上的所有请求。这意味着您可以用更有效的复合索引替换
data\u id
上的索引。

您的意思是我需要02索引:on(user\u id,data\u id)和on data\u id?总有一天我们会删除RLS!嗨Vincent Malgrat有时候我会移除RLS。我将保留两个索引:(user\u id,data\u id)和(data\u id)?是的,如果某些查询不使用RLS,并且您需要通过
data\u id
查询数据,这两个索引应该可以。