Индексируются ли внешние ключи автоматически в SQL Server?


будет ли следующая инструкция SQL автоматически создавать индекс для Table1.Table1Column, или он должен быть явно создан?

компонент Database engine-это SQL Server 2000

       CREATE TABLE [Table1] (
. . .
            CONSTRAINT [FK_Table1_Table2] FOREIGN KEY 
            (
                [Table1Column]
            ) REFERENCES [Table2] (
                [Table2ID]
            )

        )
3 61

3 ответа:

SQL Server не будет автоматически создавать индекс для внешнего ключа. Также из MSDN:

ограничение внешнего ключа не имеет быть связанным только с первичным ключом ограничение в другой таблице; он может также определите для ссылки столбцы уникального ограничения в другая таблица. ВНЕШНИЙ КЛЮЧ ограничение может содержать нулевые значения; однако, если какой-либо столбец составного Ограничение внешнего ключа содержит null значения, проверка всех значений что составляют внешний ключ ограничение пропускается. На всякий случай что все значения составного чужого Ключевые ограничения проверяются, уточняются Не NULL на всех участвующих столбцы.

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

(EDIT: добавлено, чтобы явно иметь дело с комментарием ниже -) В частности, при обеспечении согласованности данных, для которой существует ограничение внешнего ключа. индекс может влиять на производительность ограничения DRI только для удаления строки или строк на стороне FK. При использовании ограничения во время вставки или обновления процессор знает значение FK и должен проверить наличие строки в ссылочной таблице на стороне PK. Там уже есть индекс. При удалении строки на Сторона PK, она должна проверить, что на стороне FK нет строк. Индекс может быть незначительно полезен в этом случае. Но это не общий сценарий.

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

нет, Создание внешнего ключа для столбца не создает автоматически индекс для этого столбца.

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

в этом примере схема:

CREATE TABLE MasterOrder (
   MasterOrderID INT PRIMARY KEY)

CREATE TABLE OrderDetail(
   OrderDetailID INT,
   MasterOrderID INT  FOREIGN KEY REFERENCES MasterOrder(MasterOrderID)
)

OrderDetail будет сканироваться при каждом удалении записи в таблице MasterOrder. Еще одна причина для создания индекс в столбце OrderMaster в OrderDetail, вы можете себе представить, что многие запросы будут соединять эти две таблицы, и отсутствие индекса приведет к сканированию таблицы.

   SELECT ..
   FROM 
      MasterOrder ord
      LEFT JOIN OrderDetail det
       ON det.MasterOrderID = ord.MasterOrderID