Хорошо ли создавать индекс для каждого внешнего ключа в базе данных SQL Server?
Должен ли каждый внешний ключ SQL Server иметь соответствующий индекс?
Ответ 1
Да, это хорошая практика, см. здесь: Когда SQL Server переставал помещать индексы в столбцы внешнего ключа? прокрутите вниз до пункта" Есть ли какие-либо преимущества индексирования столбцов внешнего ключа? раздел
Ответ 2
Каждый внешний ключ? Нет. Если селективность низкая (т.е. Многие значения дублируются), индекс может быть более дорогостоящим, чем сканирование таблицы. Кроме того, в среде с высокой активностью (гораздо более активная вставка/обновление/удаление, чем запрос) затраты на поддержку индексов могут влиять на общую производительность системы.
Ответ 3
Причина индексации столбца внешнего ключа такая же, как и причина индексации любого другого столбца: создайте индекс, если вы собираетесь фильтровать строки по столбцу.
Например, если у вас есть таблица [Пользователь] (ID int, Имя varchar (50)) и таблица [UserAction] (UserID int, Action varchar (50)), вы, скорее всего, захотите узнать, какие действия определенный пользователь. Например, вы будете запускать следующий запрос:
select ActionName from [UserAction] where UserID = @UserID
Если вы не собираетесь фильтровать строки по столбцу, тогда нет необходимости помещать на него индекс. И даже если вы этого стоите, только если у вас более 20-30 рядов.
Ответ 4
От MSDN: Ограничения FOREIGN KEY
Создание индекса по внешнему ключу часто полезно по следующим причинам:
- Изменения в ограничениях PRIMARY KEY проверяются с ограничениями FOREIGN KEY в связанных таблицах.
- Столбцы внешнего ключа часто используются в критериях присоединения, когда данные из связанных таблиц объединены в запросах, сопоставляя столбец или столбцы в ограничении FOREIGN KEY одной таблицы с основным или уникальным ключевым столбцом или столбцами в другой таблице.