在Oracle的管理員手冊上,說明可以為表、視圖、物化視圖、過程、函數、包、對象和序列建立同義字。雖然Oracle並沒有明確說明,但是同樣可以為同義字建立同義字。
有些時候建立指向同義字的同義字是有意義的。由於同義字本身功能之一就是實現物理結構和物理位置的透明性,因此使用者在建立同義字的時候並不會太關係當前指向的對象是否是同義字還是其他對象。
Oracle處理指向同義字的同義字只是在解析對象的時候存在很小的代價,其他並沒有太多的影響。
當然如果同義字嵌套的層數過多,也不是很好的設計方式,使用者在確定要訪問真正的對象是會很麻煩,Oracle在分析對象的時候同樣也要花費時間:
SQL> create synonym s1 for t;
同義字已建立。
SQL> create synonym s2 for s1;
同義字已建立。
對於同義字S2來說,就是一個嵌套同義字,指向了同義字S1。如果這種嵌套的層數太多,也會影響分析的效能。比如,一個嵌套了10000層的同義字:
SQL> begin
2 for i in 2..10000 loop
3 execute immediate 'create synonym s' || (i+1) || ' for s' || i;
4 end loop;
5 end;
6 /
PL/SQL過程已成功完成。
SQL> set timing on
SQL> set autot on
SQL> select * from t;
未選定行
經過時間: 00: 00: 00.02
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE
1 0 TABLE ACCESS (FULL) OF 'T'
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
3 consistent gets
0 physical reads
0 redo size
267 bytes sent via SQL*Net to client
460 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed
SQL> select * from s1;
未選定行
經過時間: 00: 00: 00.02
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE
1 0 TABLE ACCESS (FULL) OF 'T'
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
3 consistent gets
0 physical reads
0 redo size
267 bytes sent via SQL*Net to client
460 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed
SQL> select * from s2;
未選定行
經過時間: 00: 00: 00.02
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE
1 0 TABLE ACCESS (FULL) OF 'T'
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
3 consistent gets
本文URL地址:http://www.bianceng.cn/database/Oracle/201410/45462.htm