是否为表中的每个外键隐式创建了非聚集索引?

时间:2019-02-23 09:07:10

标签: sql sql-server database reference sql-server-2014

如果我有一个像这样的表:

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的主键创建聚簇索引。

    < / li>

问题:

还会在表MyTable 上为外键Foo.Id 创建索引吗?

换句话说,是为依赖表上的每个外键隐式创建的非聚集索引。

换句话说,在此架构中创建的索引总数将为2,如下所示:

  1. Id上主键MyTable的聚集索引。
  2. Id上主键Foo上的聚集索引。

或者会有以下3个索引:

  1. Id上主键MyTable的聚集索引。
  2. Id上主键Foo上的聚集索引。
  3. Foo(Id)上外键MyTable上的非聚集索引。

我的问题与Microsoft SQL Server 2014有关。

1 个答案:

答案 0 :(得分:4)

否,它不会自动创建。手动创建它是一个好习惯:

The Benefits of Indexing Foreign Keys

  

与主键约束不同,为表定义外键约束时,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 demo