外键和索引问题

时间:2010-06-05 09:34:39

标签: sql-server-2008 foreign-keys indexing

我正在使用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]
提前谢谢, 乔治

2 个答案:

答案 0 :(得分:6)

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

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

有关更多背景信息,请参阅Kimberly Tripp的优秀When did SQL Server stop putting indexes on foreign key columns?博文。

答案 1 :(得分:2)

不,不会创建索引,您必须自己动手