Автоматически создает ли внешний ключ индекс?

MS SQL Server 2000

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

Моя реальная причина, по которой вы спрашиваете об этом, состоит в том, что мы имеем очень медленное время отклика в инструкции delete к таблице, которая имеет, вероятно, 15 связанных таблиц. Я спросил нашего парня базы данных, и он говорит, что если в полях есть внешний ключ, он действует как индекс. Каков ваш опыт в этом? Следует ли добавлять индексы во все поля внешнего ключа или просто лишние служебные данные?

Ответ 1

Внешний ключ - это ограничение, отношение между двумя таблицами - это не имеет никакого отношения к индексу как таковому.

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

Поэтому имеет смысл индексировать любые столбцы, участвующие в FK, но FK per se не является индексом.

Ознакомьтесь с замечательной статьей Kimberly Tripp "Когда SQL Server переставал помещать индексы в столбцы внешнего ключа?" .

Ответ 2

Ничего себе, ответы по всей карте. Таким образом, Документация говорит:

Ограничение FOREIGN KEY является кандидатом для индекса, потому что:

  • Изменения в ограничениях PRIMARY KEY проверяются с помощью ограничений FOREIGN KEY в связанных таблицах.

  • Столбцы внешнего ключа часто используются в критериях соединения, когда данные из связанных таблиц объединены в запросах, сопоставляя столбцы (столбцы) в ограничении FOREIGN KEY одной таблицы с основным или уникальным столбцом (ами) ключа в другой таблице. Индекс позволяет Microsoft® SQL Server ™ 2000 быстро находить связанные данные в таблице внешнего ключа. Однако создание этого индекса не является обязательным требованием. Данные из двух связанных таблиц могут быть объединены, даже если между таблицами не определены ограничения PRIMARY KEY или FOREIGN KEY, но отношение внешних ключей между двумя таблицами указывает на то, что обе таблицы были оптимизированы для объединения в запрос, который использует ключи как его критерии.

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

Ответ 3

Нет, не существует неявного индекса для полей внешнего ключа, иначе почему бы Microsoft не говорила "Создание индекса по внешнему ключу часто полезно" . Ваш коллега может ввести в заблуждение поле внешнего ключа в ссылочной таблице с первичным ключом в указанной таблице - первичные ключи создают неявный индекс.

Ответ 4

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

Чтобы проверить, есть ли какие-либо заказы, Sql Server должен искать таблицу больших заказов. Теперь, если есть индекс, поиск будет быстрым; если этого не произойдет, поиск будет медленным.

Итак, в этом случае медленное удаление может быть объяснено отсутствием индекса. Особенно, если Sql Server должен будет искать 15 больших таблиц без индекса.

P.S. Если у внешнего ключа включен DELETE CASCADE, сервер Sql по-прежнему должен искать таблицу заказов, но затем удалять любые заказы, которые ссылаются на удаленного клиента.

Ответ 5

SQL Server автоматически создает индексы для первичных ключей, но не для внешних ключей. Создайте индекс для внешних ключей. Это, вероятно, стоит накладных расходов.

Ответ 6

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

Ответ 7

Внешние ключи не создают индексы. Только альтернативные ограничения ключа (UNIQUE) и ограничения первичного ключа создают индексы. Это справедливо в Oracle и SQL Server.

Ответ 8

Строго говоря, внешние ключи не имеют ничего общего с индексами, да. Но, как говорили выше вышесказанные, имеет смысл создать один, чтобы ускорить поиск FK. Фактически, в MySQL, если вы не укажете индекс в своей декларации FK, двигатель (InnoDB) автоматически создаст его для вас.

Ответ 9

В PostgeSql вы можете сами проверить индексы, если вы нажмете \d tablename

Вы увидите, что индексы btree были автоматически созданы в столбцах с первичным ключом и уникальными ограничениями, но не в столбцах с внешними ключами.

Я думаю, что ответ на ваш вопрос, по крайней мере, для postgres.

Ответ 10

Я заметил, что Entity Framework 6.1, указывающая на MSSQL, автоматически добавляет индексы на внешние ключи.

Ответ 11

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