在建立对远程数据库上数据的访问时,是否首选视图或同义词?

时间:2019-04-11 13:55:17

标签: oracle oracle11g dblink

考虑有两个数据库的情况:在数据库A上,您需要访问数据库B上的数据。

您可以在数据库A上创建一个视图,该视图是从数据库B的表中选择的。

CREATE OR REPLACE VIEW Demographics.Employees(
employee_id, employee_dept
)
AS
    SELECT employee_id, employee_dept
    FROM Employee@DB_B;
/

或者,您可以在数据库A上创建一个同义词,该同义词指向数据库B上的表。

CREATE OR REPLACE SYNONYM Demographics.Employees FOR Employee@DB_B;

使用跨数据库链接的视图与跨数据库链接的同义词有什么优缺点?

如果数据库位于Exadata平台内,这会改变建议吗?

4 个答案:

答案 0 :(得分:5)

就个人而言,我更喜欢这个同义词。这就是同义词的含义,从而为您提供了访问对象的较短语法。视图更多地用于保存特定查询以供以后重用。现在,如果您想限制源表中的可用列或其他内容,那就是使用视图的时候。

答案 1 :(得分:5)

为简单起见,请使用同义词。

如果本地数据库应查看远程数据库中的所有行和列,则已定义的视图将不必要地复杂化。它增加了复杂性,因为视图中可能存在可能的一些附加逻辑。寻求了解系统的人将需要花费时间来检查视图定义并理解它。

也许对于Oracle优化器而言,该视图使事情变得更加复杂。

有观点有一些正当理由:

  • 您要限制可见的列
  • 如果将新列添加到远程表中,则您不希望它们在本地显示
  • 您要限制可见的行,并连接到其他表,等等。
  • 如果您希望在远程站点进行更改(例如删除列),而不是在应用程序运行时查找,您希望视图无效

创建视图的时间是这些条件存在的时间。即使那样,我还是要从同义词中选择视图。

答案 2 :(得分:5)

在数据库链接上创建视图时,就是在本地数据库上创建对象。这意味着您在本地具有有关远程对象的字典信息。

而同义词只是指向远程对象的指针。因此,您所拥有的只是同义词定义。

create database link loopback
  using 'localhost/pdb1';

create table t (
  c1 int
);

create or replace synonym s
  for t@loopback;

create or replace view v as 
  select * from t@loopback;

select table_name, column_name, data_type
from   user_tab_cols
where  table_name in ( 'S', 'V' )
order  by table_name, column_name ;

TABLE_NAME   COLUMN_NAME   DATA_TYPE   
V            C1            NUMBER 

因此,如果您拥有检查表结构(列,数据类型等)的工具,则使用视图会很方便。

另一方面,由于视图是本地对象,因此不会自动传播对远程表的更改:

alter table t 
  add ( c2 date ); 

info s

TABLE: T 
     LAST ANALYZED: 
     ROWS         : 
     SAMPLE SIZE  : 
     INMEMORY     :DISABLED 
     COMMENTS     : 

Columns 
NAME         DATA TYPE      NULL  DEFAULT    COMMENTS
 C1          NUMBER(38,0)   Yes              
 C2          DATE           Yes 

info v

Columns 
NAME         DATA TYPE      NULL  DEFAULT    COMMENTS
 C1          NUMBER(38,0)   Yes 

因此,您需要重新创建视图以查看更改。在翻转方面,如果您不希望远程DDL更改立即显示在本地数据库中,那么这可能是一个优势。

请注意,本地视图和远程表之间没有依赖关系。因此,中断更改(例如删除列)不会使视图无效。您只有在查询时才能找到它:

alter table t
  drop ( c1 );

select status from user_objects
where  object_name = 'V';

STATUS   
VALID    

select * from v;

ORA-00904: "C1": invalid identifier

select * from s;

no rows selected

答案 3 :(得分:2)

同义词只是指向对象的指针。如果要求只是访问对象而没有每次都放置数据库链接/所有者的麻烦,那么它们是最好的方法(考虑到您不想限制列访问)。

视图基本上是通往基础对象数据的窗口。您可以在列访问中进行选择(同义词中不可用),并且由于视图基于SQL查询,因此您可以使用sql函数(上,下,nvl等)进行各种在线数据操作,例如更改日期格式。 。),这也是同义词所无法实现的。如果将来有需要,您还可以选择修改SQL语句以包括更复杂的SQL语句。

如果只想执行获取和显示,则视图很好,如果要在其他查询中使用它,则建议使用同义词,因为没有中间SQL层,因此数据访问速度更快。

这一切都归结为您的要求和对象的使用方式。