我在一个表列上创建了一个索引作为sys用户,因为我没有提到它在sys模式下创建的模式名称。当我作为具有对表的读访问权限的不同用户运行查询时,我没有看到正在使用的索引。如果索引是在不同的模式下创建的,请告诉我是否在oracle中忽略索引?
答案 0 :(得分:2)
没有特定于索引对象的权限。所以,就我自己而言,我会说索引将被自动使用 - 即使它在不同的模式中。但是,由于对链接答案的评论引起了怀疑,我使用oracle 11g进行了实验:
用户 sonia :
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.
用户 sylvain :
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
如您所见,从{em>查询表时,都使用SYL_IDX
(在 sylvain 模式中创建的 sonia.t 上的索引) sonia 和来自 sylvain 。在表上拥有选择权限就足够了。
答案 1 :(得分: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 |
-----------------------------------------------------------------------------