Нужно ли создавать индексы на внешних ключах?

у меня есть таблица A и в таблице B. A имеет внешний ключ к B on С B_ID.

по какой-то причине (я знаю, что есть законные причины) он не использует индекс, когда я присоединяюсь к этим двум таблицам на ключе.

мне нужно отдельно создать индекс A.B_ID или наличие внешнего ключа должно обеспечить это?

6 ответов


только ограничение внешнего ключа не предоставляет индекс - необходимо (и должно) быть создано.


создание внешнего ключа не создает автоматически индекс на A. B_ID. Поэтому с точки зрения производительности запроса обычно имеет смысл создать отдельный индекс на A. B_ID.

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


просто для получения дополнительной информации: Oracle не создает индекс автоматически (как это делает для уникальных ограничений), потому что (a) не требуется применять ограничение, и (b) в некоторых случаях он вам не нужен.

большинство того времени, однако, вы захотите создать индекс (на самом деле, в Oracle Apex есть отчет о "неиндексированных внешних ключах").

всякий раз, когда приложение должно иметь возможность удалить строку в родительской таблице или обновить значение PK (что встречается реже), DML будет страдать, если индекс не существует, потому что ему придется заблокировать всю дочернюю таблицу.

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


SQL Server никогда не помещал индексы в столбцы внешнего ключа автоматически-проверьтеотличный блог на фоне и истории Это миф.

обычно рекомендуется индексировать столбцы внешнего ключа, однако-так что да, я бы рекомендовал убедиться, что каждый столбец FK подкреплен индексом; не обязательно только на одном столбце - возможно, имеет смысл создать индекс на двух или трех столбцах со столбцом FK в качестве индекса. первый там. Зависит от сценария и данных.


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

но

есть некоторые базы данных, которые уже автоматически создают индексы на внешний ключ. Реактивный Двигатель (Файлы Microsoft Access) Субд firebird В MySQL

КОНЕЧНО

SQL Server Оракул!--1-->

НЕ


Как и все, что связано с производительностью, это зависит от многих факторов, и нет silve пули, например, в очень высокой среде activilty поддержание индекса может быть неприемлемым.

наиболее заметным здесь, по-видимому, является избирательность: если значения в индексе будут сильно дублироваться, это может дать лучшую производительность, чтобы удалить индекс (если это возможно) и разрешить сканирование таблицы.