1

我已經被這樣的主鍵BIGINT和身份,超過聚集索引更喜歡非聚集索引任何理由

CREATE TABLE [dbo].[MyTable](
    [MyTableId] [bigint] IDENTITY(1,1) NOT NULL, 
    [SomeTable2Id] [bigint] NOT NULL, 
    [SomeTable3Id] [bigint] NOT NULL, 
    [SomeData] [smallint] NOT NULL, 
CONSTRAINT [PK_MyTable] PRIMARY KEY NONCLUSTERED 
(
    [MyTableId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY] 
) ON [PRIMARY] 
從上面PK_MyTable非聚集索引

除了定義的表,我有一些其他的NONCLUSTERED索引通過SomeTable2Id和SomeTable3Id

我認爲上面創建CLUSTERED索引更有意義,但我想知道有沒有很好的理由不創建一個CLUSTERED索引,而是創建NONCLUSTERED?

PS對這些主題提出了很多問題,但找不到相關的問題(前20名)。如果有問題,請將我重定向到相關的問題。

編輯:考慮這樣MyTable被映射其他兩個表SomeTable2SomeTable3和而不是有複合鍵的情況下,我們有這個MyTableId所以大部分時間我的查詢要麼SomeTable2IdSomeTable3Id,並要求得到其他ID。因此,根據這張表格的使用情況,我們是否真的需要在MyTableId之上創建聚集索引,或者是否有兩個非聚集索引SomeTable2IdSomeTable3Id就足夠了?

回答

1

我想你一定要有MyTableId爲您聚簇索引中的關鍵而沒有關於如何實際使用表格的進一步信息。

請記住,您是在作爲聚集索引或堆的表之間進行選擇。聚簇索引不是表上的索引,但是標識該表基於聚簇索引鍵存儲在B樹中。

在這兩種表上,也可以使用非聚簇索引。

對於讀取性能(特別是在更寬的表格中),非聚集索引(可能包含列)將成爲您尋找收益的地方。

+0

謝謝。我有一個問題。在我的情況下,這個表充當兩張不同表之間的映射表。我將使用這張表進行查找。大多數時候,我不會使用它的主鍵。這是否有所作爲? – Ankush

+0

@Ankush主鍵總是有一個索引(不管它是否是表的聚集索引的選擇)。如果您要通過其他方法訪問,請考慮對這些鍵(羣集或非羣集)編制索引。聚類指數的選擇應該是獨特的,狹窄的,靜態的,並且越來越多。如果你有幾個候選人,我會選擇最有可能用於範圍查詢的人,如果不是,可能是一個身份(如你的情況)。 –

+0

我明白,但這並沒有解決我在上述評論中的擔憂。我想你的意思是**不會**有所作爲,並與主鍵上的聚集索引。對? – Ankush

4

不,你肯定應該有一個聚集索引那裏。 Identity字段也是理想的集羣密鑰。

下面是金特里普關於聚集索引的一些好文章:

Clustered Index Debate

Clustered Index Debate Continues

Here is a whitepaper from MS about this topic as well.

+1

+1 Kim Tripp是SQL Server索引的最終資源,當然! :-) –

+1

@marc - 她知道她的東西,我喜歡她通常包含容易重現的例子。蓋爾肖也很棒。 – JNK

+0

是否有關係,如果表有一個外鍵引用自己?例如員工表與managerid列。 – Ankush