我正在使用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]
提前谢谢,
乔治
答案 0 :(得分:6)
没有。 SQL Server不会也从不在外键列上自动创建索引。这是一个广泛传播的都市神话 - 但它只不过是 - 一个神话。
但这是一个公认的最佳做法 - 所以这是索引调优的最基本建议之一 - 将索引放在外键列上。
有关更多背景信息,请参阅Kimberly Tripp的优秀When did SQL Server stop putting indexes on foreign key columns?博文。
答案 1 :(得分:2)
不,不会创建索引,您必须自己动手