#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
отсутствие разницы в производительности между представлением и синонимом