2014-10-03 63 views

回答

0

好,不一定存儲在磁盤上的排序順序主鍵。但聚集索引是。在絕大多數情況下,主鍵是聚集索引。雖然這不一定能保證結果的排序,但結果通常是按照默認聚簇索引排序的。

我怎麼能以隨機順序存儲的GUID作爲主鍵

的GUID不作出正是這種原因,良好的聚集索引。 SQL Server確實有一些東西叫做Sequential GUID來解決這個問題。生成的GUID不會連續,但它們將是連續的。它有一些注意事項,但:

創建一個GUID比以前這個功能指定的計算機上生成自Windows啓動任何GUID更大。

如果系統重新啓動,序列丟失。如果多個系統創建密鑰,則序列會丟失。另外,還有一個問題是,我們仍然依靠SQL Server來生成密鑰,這是使用GUID的一個重要原因。

一般來說,我不會使用GUID作爲一個聚集索引建議。作爲替代方案,可以使用普通的IDENTITY鍵作爲聚集索引並創建單獨的GUID列(可能具有其自己的索引,甚至是唯一的約束,以確保應用程序不會嘗試重新插入現有記錄)。這個單獨的列成爲一種更具商業邏輯意義的「全局標識符」,而不是數據持久性實現意義上的那種。

+0

用於覆蓋連續指導的+1 – JiggsJedi 2014-10-03 19:19:52

+2

聚集索引並不意味着數據必然按照光盤上的順序排列。 [我的答案在這裏更詳細](http://stackoverflow.com/a/24470091/73226) – 2014-10-03 19:31:53

+0

@MartinSmith:我誤解了文檔? http://msdn.microsoft.com/en-us/library/ms190457.aspx'「聚簇索引根據數據的鍵值對錶或視圖中的數據行進行排序和存儲,這些列包含在索引定義中。每個表只能有一個聚簇索引,因爲數據行本身可以按照一個順序排序。「' – David 2014-10-03 19:33:49

2

否,該表數據並不總是存儲在主鍵的順序,但通常的主鍵有聚簇索引,以及該數據總是存儲在聚簇索引的順序。

如果您不想存儲在主鍵的順序中的數據,你應該使用它一個非聚集索引。

請注意,儘管您通常按照存儲順序獲取數據,但除非您使用order by子句,否則不保證該順序。如果訂單非常重要,您應該始終指定它應該是什麼。

+0

好吧。非聚集索引有什麼缺點嗎? 謝謝你的回答。 – 2014-10-05 09:37:42

+0

@AKshayRaut:只有在索引中彼此相鄰的記錄不會在表中彼此相鄰存儲,因此提取一系列記錄可能會稍微慢一點。但是,爲guid建立聚簇索引會導致嚴重的碎片化,這會降低所有查詢的性能,而不僅僅是一些特殊情況。 – Guffa 2014-10-05 12:18:41

+0

好的。再次感謝。 – 2014-10-07 11:50:22

1

無主鍵並不總是按排序順序存儲。

聚集索引總是以排序順序存儲,這與流行的誤解相反。

如果您選擇隨機GUID作爲集羣主鍵,那麼您很可能很快就會得到高度分散的聚簇索引,其中物理和邏輯順序在頁面變滿並且需要拆分時發生很大的分歧。

通常,大多數聚簇索引掃描通過遵循頁面指針而不是分配(頁碼)順序以邏輯(索引鍵)順序發生。爲了分配有序掃描,必須在讀取未提交的隔離級別時運行,或者必須保持表鎖。

然而,沒有訂單就沒有保證結果順序。

+0

謝謝你的回答。 – 2014-10-05 09:41:25