如果我有一个像这样的表:
CREATE TABLE MyTable
(
Id INT PRIMARY KEY IDENTITY(1, 1),
FooId INT NOT NULL FOREIGN KEY REFERENCES Foo(Id),
Data NVARCHAR(10) NOT NULL
);
可能会观察到以下情况:
将在表Id
的主键列MyTable
上创建聚簇索引。
此外,可以推断,将在表Foo
上为其名为Id
的主键创建聚簇索引。
问题:
还会在表MyTable 上为外键Foo.Id
创建索引吗?
换句话说,是为依赖表上的每个外键隐式创建的非聚集索引。
换句话说,在此架构中创建的索引总数将为2,如下所示:
Id
上主键MyTable
的聚集索引。Id
上主键Foo
上的聚集索引。或者会有以下3个索引:
Id
上主键MyTable
的聚集索引。Id
上主键Foo
上的聚集索引。Foo(Id)
上外键MyTable
上的非聚集索引。我的问题与Microsoft SQL Server 2014有关。
答案 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