Мне сказали, что если я получу внешний ключ от двух таблиц, то SQL Server создаст что-то похожее на индекс в дочерней таблице. Мне трудно поверить, что это правда, но я не могу найти многое, связанное именно с этим.
Моя настоящая причина спрашивать это потому, что мы испытываем очень медленное время ответа в операторе удаления для таблицы, которая, вероятно, имеет 15 связанных таблиц. Я спросил нашего парня из базы данных, и он сказал, что если на полях есть внешний ключ, то он действует как индекс. Каков ваш опыт с этим? Стоит ли добавлять индексы ко всем полям внешнего ключа или это просто ненужные накладные расходы?
sql-server
Ник ДеВоре
источник
источник
Ответы:
Внешний ключ - это ограничение, связь между двумя таблицами, которая не имеет ничего общего с индексом как таковым.
Но это известный факт, что имеет большой смысл индексировать все столбцы, которые являются частью любого отношения внешнего ключа, потому что через FK-отношение вам часто придется искать соответствующую таблицу и извлекать определенные строки на основе одно значение или диапазон значений.
Поэтому имеет смысл индексировать любые столбцы, включенные в FK, но сам по себе FK не является индексом.
Ознакомьтесь с прекрасной статьей Кимберли Триппа "Когда SQL Server прекратил помещать индексы в столбцы внешнего ключа?" ,
источник
REFERENCES
. Он автоматически создаетUNIQUE
индекс для ограниченияPRIMARY KEY
или илиUNIQUE
и требует, чтобыUNIQUE
индекс присутствовал для ссылочной стороны отношения внешнего ключа, но автоматически ничего не делает для ссылочной стороны, хотя часто рекомендуется создать его самостоятельно. Смотрите stackoverflow.com/questions/970562/…Вау, ответы есть по всей карте. Итак, в документации сказано:
Ограничение FOREIGN KEY является кандидатом на индекс, потому что:
Изменения ограничений PRIMARY KEY проверяются с помощью ограничений FOREIGN KEY в связанных таблицах.
Столбцы внешнего ключа часто используются в критериях соединения, когда данные из связанных таблиц объединяются в запросах путем сопоставления столбцов в ограничении FOREIGN KEY одной таблицы со столбцами первичного или уникального ключа в другой таблице. Индекс позволяет Microsoft® SQL Server ™ 2000 быстро находить связанные данные в таблице внешнего ключа. Однако создание этого индекса не является обязательным требованием. Данные из двух связанных таблиц могут быть объединены, даже если между таблицами не определены ограничения PRIMARY KEY или FOREIGN KEY, но отношение внешнего ключа между двумя таблицами указывает на то, что эти две таблицы были оптимизированы для объединения в запросе, который использует ключи как его критерии.
Таким образом, кажется довольно ясным (хотя документация немного запутана), что на самом деле он не создает индекс.
источник
Нет, неявный индекс для полей внешнего ключа отсутствует, иначе почему бы Microsoft сказала: «Создание индекса по внешнему ключу часто полезно» . Ваш коллега может быть запутанным ключевое поле иностранного в ссылающейся таблице с первичным ключом в указанных к таблице - первичные ключи действительно создать неявный индекс.
источник
SQL Server автоматически создает индексы для первичных ключей, но не для внешних ключей. Создайте индекс для внешних ключей. Это, вероятно, стоит накладных расходов.
источник
Скажем, у вас есть большой стол под названием заказы и маленький стол под названием клиенты. Существует внешний ключ от заказа к клиенту. Теперь, если вы удаляете клиента, Sql Server должен проверить, что нет орфанных заказов; если есть, то возникает ошибка.
Чтобы проверить, есть ли какие-либо заказы, Sql Server должен искать в таблице больших заказов. Теперь, если есть индекс, поиск будет быстрым; если нет, поиск будет медленным.
Поэтому в этом случае медленное удаление может быть объяснено отсутствием индекса. Особенно если Sql Server придется искать 15 больших таблиц без индекса.
PS Если внешний ключ имеет значение ON DELETE CASCADE, Sql Server все равно должен выполнить поиск в таблице заказов, но затем удалить все заказы, которые ссылаются на удаленного клиента.
источник
Внешние ключи не создают индексы. Только ограничения альтернативного ключа (UNIQUE) и ограничения первичного ключа создают индексы. Это верно в Oracle и SQL Server.
источник
Не в моих знаниях. Внешний ключ только добавляет ограничение, что значение в дочернем ключе также должно быть представлено где-то в родительском столбце. В базе данных не говорится, что дочерний ключ также должен быть проиндексирован, только ограничен.
источник
Строго говоря, внешние ключи не имеют абсолютно никакого отношения к индексам, да. Но, как указали вышеупомянутые ораторы, имеет смысл создать такой, чтобы ускорить поиск в FK. Фактически, в MySQL, если вы не укажете индекс в объявлении FK, механизм (InnoDB) создаст его для вас автоматически.
источник
В PostgeSql вы можете самостоятельно проверить наличие индексов, если нажмете \ d имя_таблицы
Вы увидите, что индексы btree были автоматически созданы для столбцов с первичным ключом и уникальными ограничениями, но не для столбцов с внешними ключами.
Я думаю, что это отвечает на ваш вопрос, по крайней мере, для Postgres.
источник
Я заметил, что Entity Framework 6.1, на который указывает MSSQL, автоматически добавляет индексы для внешних ключей.
источник
InnoDB требует индексов для внешних ключей и ссылочных ключей, чтобы проверка внешних ключей могла быть быстрой и не требовала сканирования таблицы. В ссылочной таблице должен быть индекс, в котором столбцы внешнего ключа перечислены как первые столбцы в том же порядке.
источник