我注意到即使没有当前模式的同义词,索引仍在使用。我在下面进行了测试:
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)
那么,这是否意味着在索引上创建同义词的不必要?如果我们对索引提出同义词,会产生负面影响吗?
在索引上创建同义词是不必要的(毫无意义但无害的(,因为没有任何人在其代码中引用索引名称。没有人做。