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


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

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

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

6 98

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 никогда не помещал индексы в столбцы внешнего ключа автоматически-проверьте Kim Tripp's отличный пост в блоге на фоне и истории Это миф.

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

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

но

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

НАВЕРНЯКА

SQL Server Оракул

НЕ

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

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