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