Влияют ли ограничения внешнего ключа на преобразования запросов в 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)


person Lukas Eder    schedule 16.11.2011    source источник


Ответы (2)


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

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

person Justin Cave    schedule 16.11.2011
comment
Я был уверен, что уже читал что-то подобное. Во всяком случае, это кажется очевидным. Спасибо за отличный ответ и ссылку! - person Lukas Eder; 16.11.2011
comment
Неработающая ссылка, я думаю, презентация такая: docslide.us/ documents/metadata-matters-by-tom-kyte-oracle.html - person gaps96; 16.01.2017

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

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

person Lukas Eder    schedule 30.01.2018