2011-10-06 41 views
0

我有两个字段的表data1:user_id和data_id。我在user_id和data_id上有两个索引。它们是非唯一索引的。Oracle 10g上的索引和RLS

功能:

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

我注册这个功能对数据1 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); 

感谢,

+0

你的意思是说我需要02 index:on(user_id,data_id)和data_id吗?有一段时间我们会删除RLS! – QuangND

回答

2

一般就有些浪费有三个指标为两列(data_id)(user_id,data_id)(user_id)因为Oracle可以使用复合索引的查询上user_id该过滤器,并在这两个查询该过滤器列。

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

+0

嗨,文森特马尔格拉特,有时候,我会删除RLS。我会保留2个索引:(user_id,data_id)和(data_id)? – QuangND

+0

是的,如果某些查询不使用RLS,并且您需要通过'data_id'查询您的数据,那么这两个索引应该没问题。 –