数据库中对象名称解析顺序

    今天学习了一个案例:通过恰当的使用同义词,达到降低数据库逻辑读的目的。

    “恰当”两字,正是根据数据库中对象名称解析顺序的不同而设定的。先让我们一起看下在Oracle中,数据库对象名称的解析顺序:

  1. Oracle首先查看在发出命令的用户模式中是否存在表或视图。
  2. 如果表或视图不存在,Oracle检查私有同义词是否存在。
  3. 如果私有同义词存在,将使用这个同义词所引用的对象。
  4. 如果私有同义词不存在,检查同名的公共同义词是否存在。
  5. 如果公共同义词存在,将使用这个同义词所引用的对象。
  6. 如果公共同义词不存在,Oracle返回消息”ORA-00942 table or view does not exit”。

我们可以看到,Oracle对数据库对象的解析顺序是:①表或视图——>②私有同义词——>③公共同义词——>④返回ORA-00942错误

这里需要注意的是,在同一schema下,如果已经存在表或视图,则与其重名的同义词将不能被创建(CHINA Unix这个帖子:http://bbs.chinaunix.net/archiver/?tid-1846714.html 不靠谱!还是看IT PUB把:http://www.itpub.net/viewthread.php?tid=1388745&extra=&page=1

对于同一用户下同义词不能与视图/表重名的问题,我做了如下实验:

  1. 在SYS用户下创建表basedata,插入数据,创建视图access_basedata
  2. 在SYS用户下创建表basedata2,插入数据,定义private同义词accesss_basedata

SQL> create table basedata(name varchar2(20));

Table created.

 
 

SQL> insert into basedata values (‘marshall 1′);

1 row created.

 
 

SQL> create view access_basedata as

2 select * from basedata;

View created.

 
 

SQL> select * from basedata;

NAME

——————–

marshall 1

 
 

SQL> select * from access_basedata;

NAME

——————–

marshall 1

紧接着进行第二步,创建private同义词时出现错误

SQL> create table basedata2(name varchar2(20));

Table created.

 
 

SQL> insert into basedata2 values(‘marshall 2′);

1 row created.

 
 

SQL> create synonym access_basedata for basedata2;

create synonym access_basedata for basedata2

*

ERROR at line 1:

ORA-00955: name is already used by an existing object

 
 

SQL> show user

USER is “SYS”

    但是这时候,我们可以为表创建public同义词

SQL> create public synonym access_basedata for basedata2;

Synonym created.

    作为补充,这个由数据对象名称顺序衍生出来的使用同义词降低逻辑读的方法如下:

如果某视图定义为访问多个表提取数据,这时查询此视图的是所需要的执行时间与buffer gets将会较高。如果这个视图不是在应用用户下,我们可以这样优化:在应用用户下,根据视图定义创建一个表,包含视图定义的全部数据,然后在此用户下创建一个private同义词,与视图名称相同。这样当应用用户查询视图时,会根据优先级优先访问private同义词引用的对象(表),达到优化效果。

    如果视图本身就是在应用用户下,我们可以过此视图在应用用户下创建一个表,然后修改视图定义,使其直接从表中查询数据即可。

    讲的比较简略,有错误请不吝赐教!

 
 

参考文献:

盖国强 《深入解析Oracle DBA入门、进阶与诊断案例》

                石头磨牙用同义词降低逻辑读

普人特福的博客cnzz&51la for wordpress,cnzz for wordpress,51la for wordpress