При установлении доступа к данным в удаленной базе данных предпочтительны представления или синонимы?

#oracle #oracle11g #dblink

#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;
  

Каковы преимущества и недостатки использования представления по ссылке DB по сравнению с синонимом по ссылке DB?

Если базы данных находятся на платформе Exadata, меняет ли это рекомендацию?

Комментарии:

1. Мне сложнее настраивать представления. Поскольку они не могут использовать объединения на основе индекса, они более непрозрачны для оптимизатора. Также я не думаю, что вы можете использовать подсказку «ВЕДУЩИЙ САЙТ» для локального представления, и это очень полезно при настройке запросов ссылок на БД. Я не могу придумать никаких недостатков в использовании синонима, поэтому я бы предложил это.

2. Представления @kfinity не могут использовать объединения на основе индекса?

3. @WilliamRobertson Я имею в виду, что индексы в таблицах внутри представления не видны оптимизатору, когда вы соединяете представление с чем-то другим. Подробнее: blogs.oracle.com/optimizer /…

4. Почему либо? Что плохого в том, чтобы просто вводить FROM Employee@DB_B те запросы, которые в этом нуждаются? Тому, кто просматривает запрос, возможно, для настройки, полезно знать, что это распределенный запрос. Мне было бы более интересно поместить представление в удаленную базу данных как своего рода общедоступный API для этой базы данных, а не разрешать удаленным запросам напрямую обращаться к таблицам, поскольку это затрудняет анализ влияния изменений.

5. @MatthewMcPeak по правде говоря, эти удаленные объекты появляются во многих запросах. Поэтому, если каноническое местоположение любого из этих объектов когда-либо перемещалось, я хочу изменить как можно меньше ссылок.

Ответ №1:

Когда вы создаете представление по ссылке на базу данных, вы создаете объект в локальной базе данных. Это означает, что у вас есть словарная информация об удаленном объекте локально.

Тогда как синоним — это просто указатель на удаленный объект. Итак, все, что у вас есть, это определение синонима.

 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
  

Ответ №2:

Для простоты используйте синоним.

Определенное вами представление является ненужным усложнением, если локальная база данных должна видеть все строки и столбцы из удаленной базы данных. Это добавляет сложности, поскольку в представлении может существовать некоторая дополнительная логика. Тому, кто хочет понять систему, потребуется потратить время на изучение определения представления и его понимание.

Возможно, представление усложняет работу оптимизатора Oracle.

Есть несколько веских причин для наличия представления:

  • Вы хотите ограничить видимые столбцы
  • Если в удаленную таблицу добавляются новые столбцы, вы не хотите, чтобы они отображались локально
  • Вы хотите ограничить видимые строки, присоединиться к другим таблицам и т. Д.
  • Вы хотите, чтобы представление было недействительным, если изменения вносятся на удаленном сайте (например, удаление столбца), а не выясняются во время выполнения приложения

Время для создания представления — это когда существуют эти условия. Даже тогда я бы выбрал представление из синонима.

Комментарии:

1. «Даже тогда я бы выбрал представление из синонима». — интересно. Я полагаю, это делается для того, чтобы исключить часть «@DB_B» из определения представления, тем самым упрощая переназначение dblink по мере необходимости (потому что вам нужно будет изменить только определение ссылки, а не потенциально десятки определений объектов)?

Ответ №3:

Лично я бы предпочел синоним. Для этого и существуют синонимы, дающие вам более короткий синтаксис для доступа к объекту. Представление больше предназначено для сохранения определенного запроса для последующего повторного использования. Теперь, если вы хотите ограничить доступные столбцы в исходной таблице или что-то в этом роде, вы бы использовали представление.

Ответ №4:

Синонимы — это просто указатели на объекты. Если требуется просто получить доступ к объекту без необходимости каждый раз указывать ссылку на базу данных / владельца, они являются наилучшим подходом (учитывая, что вы не хотите ограничивать доступ к столбцам).

Представления — это, по сути, окно к базовым данным объекта. Вы можете выбирать доступ к столбцам (невозможно в synonym), и поскольку представление основано на SQL-запросе, вы можете выполнять всевозможные онлайн-манипуляции с данными, такие как изменение формата даты, Использование функций sql (верхний, нижний, nvl и т. Д.), Опять же, Что невозможно с синонимами. У вас также есть возможность изменить инструкцию SQL, чтобы включить более сложную инструкцию SQL, если возникнет необходимость в будущем.

Представления хороши, если вы просто хотите выполнить выборку и отображение, если вы хотите использовать это в другом запросе, рекомендуется использовать синонимы, поскольку нет промежуточного уровня SQL, поэтому доступ к данным происходит быстрее.

Все сводится к вашему требованию и способу использования объекта.

Комментарии:

1. Рекомендуется использовать синонимы, поскольку нет промежуточного уровня SQL, поэтому доступ к данным происходит быстрее — при условии, что представление — это просто select * from t@dblink отсутствие разницы в производительности между представлением и синонимом