2010-06-05 97 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