2017-04-23 62 views
0

我注意到索引仍在使用,即使它们没有当前模式的同义词。 我跑到下面的测试:根据不同的模式HRCUSTDo索引需要使用同义词

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; 

其它模式下创建一个索引

SHOW USER; 

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

创建的表:

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) 

那么,这是否意味着它不需要在创建同义词指标? 如果我们将索引放在同义词上,会有负面影响吗?

回答

3

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

+0

您可能直接在访问提示中引用索引;但仍然不需要同义词。 – Ben