Создается ли не кластеризованный индекс неявно для каждого внешнего ключа в таблице? - PullRequest
0 голосов
/ 23 февраля 2019

Если у меня есть такая таблица:

CREATE TABLE MyTable
(
    Id INT PRIMARY KEY IDENTITY(1, 1), 
    FooId INT NOT NULL FOREIGN KEY REFERENCES Foo(Id),
    Data NVARCHAR(10) NOT NULL
);

Могут быть сделаны следующие наблюдения:

  1. Кластерный индекс будет создан для столбца первичного ключаId в таблице MyTable.

  2. Также, как можно заключить, будет создан кластеризованный индекс для таблицы Foo для его первичного ключа с именем Id.

Вопрос:

Будет ли также создан индекс для внешнего ключа Foo.Id для таблицы MyTable ?

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

Другими словами, будет ли общее число индексов, созданных в этой схеме, равным 2 следующим образом:

  1. Кластерный индекс для первичного ключа Id в таблице MyTable.
  2. Кластерный индекс по первичному ключу Id в таблице Foo.

Или будут следующие 3 индекса:

  1. Кластерный индекс для первичного ключа Id в таблице MyTable.
  2. Кластерный индекс для первичного ключа Id в таблице Foo.
  3. Неиндекс по внешнему ключу Foo(Id) для таблицы MyTable.

Мой вопрос относится к Microsoft SQL Server 2014.

1 Ответ

0 голосов
/ 23 февраля 2019

Нет, он не создается автоматически.Рекомендуется создавать его вручную:

Преимущества индексации внешних ключей

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

CREATE TABLE MyTable(
  Id int PRIMARY KEY IDENTITY(1, 1), 
  FooId int NOT NULL FOREIGN KEY REFERENCES Foo(Id),
  Data nvarchar(10) NOT NULL,
);

exec sp_helpIndex 'MyTable'

index_name  index_description   index_keys
PK__MyTable__3214EC0742A69968   clustered, unique, primary key located on PRIMARY Id

Явноесоздание индекса:

CREATE TABLE MyTable (
  Id int PRIMARY KEY IDENTITY(1, 1), 
  FooId int NOT NULL FOREIGN KEY REFERENCES Foo(Id),
  Data nvarchar(10) NOT NULL,
  INDEX FK_FooId nonclustered(FooId)  -- inline syntax
); 

exec sp_helpIndex 'MyTable'

index_name  index_description   index_keys
FK_FooId    nonclustered located on PRIMARY     FooId
PK__MyTable__3214EC0779B032FB   clustered, unique, primary key located on PRIMARY Id

db <> демо fiddle

...