Подтвердить что ты не робот

Связаны ли ограничения внешнего ключа с преобразованиями запросов в Oracle?

У меня такая ситуация:

create table a(
  a_id number(38) not null,
  constraint pk_a primary key (id)
);

create table b(
  a_id number(38) not null
);

create index b_a_id_index on b(a_id);

Теперь b.a_id на самом деле означает внешний ключ, ссылающийся на a.a_id, но формально не объявляется как таковой. Очевидно, что это должно быть по соображениям целостности. Но ограничение внешнего ключа также улучшает производительность соединения в целом или в конкретных случаях? Если да, для каких типов преобразований запросов?

Есть ли соответствующая документация по этой теме?

Я использую Oracle 11g (11.2.0.2.0)

4b9b3361

Ответ 1

Да, наличие ограничений внешнего ключа может улучшить производительность запросов. Существуют различные преобразования, которые открыты для оптимизатора, когда существуют соответствующие ограничения внешнего ключа, которые обычно недоступны. Например, если вы должны присоединиться к A и B, а только выбрать данные из B, оптимизатор может полностью исключить A из плана запроса, если на нем есть ограничение внешнего ключа (такого рода вещи очень удобен, когда у вас есть полезные представления, которые присоединяются к большему количеству таблиц, чем требуется для текущего запроса, потому что вам не нужно торговать расходами на добавление дополнительных объединений против повторного использования кода с использованием существующего представления). Они также пригодится, когда вы делаете такие вещи, как использование таких вещей, как переписывание запросов, чтобы переписать запрос для использования материализованного представления в системе хранилища данных /DSS.

В Tom Kyte есть презентация Вопросы метаданных, в которой говорится о том, как различные типы ограничений вместе с другими метаданными могут влиять на оптимизатор.

Ответ 2

Как Justin уже указывал, исключение JOIN является существенным преобразованием SQL без затрат, которое может применяться на основе наличия только метаданных. Об этом я недавно написал в блоге:

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