2014-10-15 7 views
4

Я создал индекс в одном столбце таблицы как пользователь sys, так как я не упомянул имя схемы, которое оно создало в рамках схемы sys. Когда я запускаю запрос как другой пользователь с доступом для чтения к таблице, я не вижу используемый индекс. Не могли бы вы сообщить мне, будет ли индекс игнорироваться в оракуле, если индекс создается по другой схеме?Индекс, созданный под другим пользователем

+0

Для справки см: http://stackoverflow.com/questions/3439529/what-to-grant-to- user-to-use-index-of-table-while-quering Не уверен, что это должно быть отмечено как дубликат, так как ответ (только), вероятно, не является удовлетворительным. Или это? –

+0

Ответ кажется противоречивым, говорят, что другой говорит, что он не использует. – Hari

+0

У меня нет доступа к экземпляру oracle на данный момент, но вы можете начать с чтения http://docs.oracle.com/cd/B10500_01/server.920/a96521/privs.htm#15311. Вы также можете исследовать системные представления, чтобы проверить, есть ли там ваш индекс. –

ответ

2

Это не разрешения, специфичные для объектов индекса. Итак, я бы сказал, что индекс будет автоматически использоваться, даже если он находится в другой схеме. Но, как комментарий на связанный ответ поднял сомнения, я сделал эксперимент с использованием Oracle 11g:

Как пользователь Соню:

SQL> create table t as (select level n from dual connect by level < 100); 
Table created. 

SQL> explain plan for select * from sonia.t where n < 10; 
SQL> @UTLXPLS.SQL 

TABLE ACCESS FULL T 
SELECT STATEMENT 

SQL> grant select on t to sylvain; 
Grant succeeded. 

Как пользователь Сильвен:

SQL> explain plan for select * from sonia.t where n < 10; 
Explained. 

SQL> @UTLXPLS.SQL 

TABLE ACCESS FULL T 
SELECT STATEMENT 

SQL> create index syl_idx on sonia.t(n); 
Index created. 

SQL> explain plan for select * from sonia.t where n < 10; 
Explained. 

SQL> @UTLXPLS.SQL 

INDEX RANGE SCAN SYL_IDX 
SELECT STATEMENT 

Назад до sonia:

SQL> explain plan for select * from sonia.t where n < 10; 
Explained. 

SQL> @UTLXPLS.SQL 

INDEX RANGE SCAN SYL_IDX 
SELECT STATEMENT 

Как вы можете видеть, SYL_IDX (индекс sonia.t созданных в Сильвенах схемы) используется как при запросе таблицы из Сони и от Сильвианы. Наличие разрешения на выбор на столе является достаточным.

1

Нет, его не следует игнорировать. Оптимизатором может быть другая причина, чтобы не использовать индекс.

Легко проверить, что вы можете использовать индекс в другой схеме:

-- Connected as power_user 
SQL> CREATE TABLE some_user.a_table (a_field INTEGER); 
Table created 

SQL> INSERT INTO some_user.a_table 
    2 SELECT rownum FROM dual CONNECT BY level <= 10000; 
10000 rows inserted 

SQL> CREATE INDEX power_user.an_index ON some_user.a_table (a_field); 
Index created 

-- Connected as some_user 
SQL> select * from some_user.a_table where a_field = 50; 

    A_FIELD 
---------- 
     50 


Execution Plan 
---------------------------------------------------------- 
Plan hash value: 573181184 

----------------------------------------------------------------------------- 
| Id | Operation  | Name  | Rows | Bytes | Cost (%CPU)| Time  | 
----------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT |   |  1 | 13 |  1 (0)| 00:00:01 | 
|* 1 | INDEX RANGE SCAN| AN_INDEX |  1 | 13 |  1 (0)| 00:00:01 | 
----------------------------------------------------------------------------- 
Смежные вопросы