索引是否需要使用同义词

时间:2017-04-23 18:02:44

标签: sql oracle indexing

我注意到索引仍在使用,即使它们没有当前架构的同义词。 我在下面进行了测试:

SHOW USER;

----------------
USER is "APPS"

在不同的架构HRCUST

下创建表格
create table hrcust.test_idx_tbl
(
    id      number
,   data1   varchar2(100)
,   data2   varchar2(100)
);

为自定义表创建了一个同义词

create synonym apps.test_idx_tbl for hrcust.test_idx_tbl;

在另一个架构下创建了一个索引:

create index hrcust.test_idx_idx on hrcust.test_idx_tbl(id);

插入一些虚拟值:

begin

    for i in 1..10000 loop

        insert into hrcust.test_idx_tbl
        (
            id    
        ,   data1 
        ,   data2 
        )
        values
        (
            i
        ,   'data'||i
        ,   'data'||i
        );

    end loop;

end;    

检查解释计划,即使我明确使用APPS同义词

,它仍使用索引
select  *
from    apps.test_idx_tbl
where   id = 1;

Plan hash value: 3233418199

--------------------------------------------------------------------------------------------
| Id  | Operation                   | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |              |     1 |   117 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| TEST_IDX_TBL |     1 |   117 |     1   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | TEST_IDX_IDX |     1 |       |     1   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("ID"=1)

这是否意味着不必在索引上创建同义词? 如果我们将同义词放在索引上会有负面影响吗?

1 个答案:

答案 0 :(得分:3)

在索引上创建同义词是不必要的(无意义但无害),因为没有理由让任何人在其代码中引用索引名称。从来没有人这样做过。