Влияют ли ограничения внешнего ключа на преобразования запросов в Oracle? - PullRequest
12 голосов
/ 16 ноября 2011

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

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)

Ответы [ 2 ]

14 голосов
/ 16 ноября 2011

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

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

1 голос
/ 30 января 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...