2010-06-05 100 views
2

我正在使用SQL Server 2008 Enterprise。我有一个表,其中一列是指另一个表(在同一个数据库中)与另一个表中的另一列相同的外键,这里是相关的SQL语句,更详细地说,表[Foo]中的[AnotherID]列指的是另一个表[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] 

由于事先 乔治

回答

6

号SQL Server不也从来不会自动创建外键列索引。这是一个广泛传播的城市神话 - 但它不过是一个神话。

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

查看Kimberly Tripp的优秀When did SQL Server stop putting indexes on foreign key columns?博客文章了解更多背景信息。

+0

1.马克,对不起,我的英文不好。你的意思是没有为表[Foo]的[AnotherID]列创建索引,对吗? 2.所以,如果我经常使用[AnotherID]访问表[Foo],它将会非常低效,正确吗? – George2 2010-06-05 09:40:47

+1

@ George2:纠正两个计数。 – Piskvor 2010-06-05 09:45:14

+1

@ George2:是的,确切地说:默认情况下,SQL Server不会**在Foo.AnotherID上创建索引,是的,拥有索引可以使某些操作(连接,查找)更快。 – 2010-06-05 09:52:06

2

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

+0

因此,如果我经常使用[AnotherID]访问表[Foo],它会非常低效,正确吗? – George2 2010-06-05 09:44:06

+2

如果你想知道肯定没有相信互联网的人,我会说看看执行计划 – SQLMenace 2010-06-05 09:47:05