外键和索引问题

Geo*_*ge2 2 indexing foreign-keys sql-server-2008

我正在使用SQL Server 2008 Enterprise.我有一个表,其中一个列是指另一个表中的另一个列(在同一个数据库中)作为外键,这里是相关的SQL语句,更详细地说,表[Foo]中的列[AnotherID]指的是另一个table [Goo]的列[GID]作为外键.[GID]是表[Goo]上的主键和聚簇索引.

我的问题是,通过这种方式,如果我没有显式地在[Foo]上的[AnotherID]列上创建索引,是否会为[Foo]上的[AnotherID]列自动创建索引 - 因为它的外键引用列[表[Goo]上的GID]已经有主群集密钥索引?

CREATE TABLE [dbo].[Foo](
    [ID] [bigint] IDENTITY(1,1) NOT NULL,
    [AnotherID] [int] NULL,
    [InsertTime] [datetime] NULL CONSTRAINT DEFAULT (getdate()),
 CONSTRAINT [PK_Foo] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

ALTER TABLE [dbo].[Foo]  WITH CHECK ADD  CONSTRAINT [FK_Foo] FOREIGN KEY([Goo])
REFERENCES [dbo].[Goo] ([GID])
ALTER TABLE [dbo].[Foo] CHECK CONSTRAINT [FK_Foo]
Run Code Online (Sandbox Code Playgroud)

乔治,提前谢谢

mar*_*c_s 6

不,SQL Server不会也永远不会在外键列上自动创建索引.这是一个广泛传播的都市神话 - 但它只不过是 - 一个神话.

但这是一个公认的最佳实践 - 所以这是索引调优的最基本建议之一 - 将索引放在外键列上.

请参阅Kimberly Tripp的优秀SQL Server何时停止将索引放在外键列上?博客文章了解更多背景信息.