我的表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);
谢谢,
答案 0 :(得分:2)
一般来说,为(data_id)
,(user_id,data_id)
和(user_id)
两列提供三个索引会很浪费,因为Oracle可以对user_id
上过滤的查询使用复合索引和筛选两个列的查询。
在您的情况下,DBMS_RLS.ADD_POLICY
过程会将过滤器user_id=XX
添加到此对象的所有请求中。这意味着您可以使用更高效的复合索引替换data_id
上的索引。