Sql-Server

當我已經有合適的唯一聚集索引時,為什麼 PK 約束需要單獨的索引?

  • August 6, 2015

這是此處表定義的一部分:

CREATE TABLE [dbo].[JobItems] (
[ItemId]            UNIQUEIDENTIFIER NOT NULL,
-- lots of other columns
CONSTRAINT [PrimaryKey_GUID_HERE] PRIMARY KEY NONCLUSTERED ([ItemId] ASC)
);

CREATE UNIQUE CLUSTERED INDEX [JobItemsIndex]
ON [dbo].[JobItems]([ItemId] ASC);

這是一些遺留設計,所以請不要問“為什麼”。無論如何,當我查看索引列表時,我看到有兩個索引 - 其中一個是JobItemsIndex,另一個是PK-GUID-HERE,它們都用於JobItems表。

我的問題是…

為什麼需要一個單獨的索引來維護 PK 當我已經擁有JobItemsIndex唯一的並且包含相同的列並且適合維護 PK 約束時?

其他兩個答案是存在兩個索引的原因:您告訴數據庫創建兩個索引。此外,您可以使主鍵聚集並刪除第二個索引。

要回答您關於為什麼“需要”第二個索引的問題歸結為 Sql Server Azure 版本數據庫的限制/要求,而其他版本的 Sql Server 中不存在該限制/要求。Sql Server Enterprise/Standard/Express 都支持堆表。 Sql Server Azure 版本不支持堆表。 我的猜測是在某些時候他們希望“JobItems”表成為一個堆表。當需要將數據庫放在雲中時,他們被迫在表上建立一個聚集索引。開發人員選擇創建集群的重複索引,而不是將主鍵從非集群更改為集群。他們為什麼選擇這個我們可能永遠不會知道……但是,這似乎是解決您的情況的合理途徑,特別是如果這個“遺留”表在其生命中的某個時刻生活在 Azure 之外。

在 StackOverflow 上查看這個問題這個問題也可能是有益的,他們在同一列上討論了非聚集索引和聚集索引。第一個問題中評分最高的答案表明,同時擁有兩個索引可能會提高性能。第二個問題的答案基本上更詳細地重申了其他人在回答您的問題時已經說過的話。

引用自:https://dba.stackexchange.com/questions/108952