2009-10-19 233 views
20

在所有主鍵均爲GUID的數據庫中,使用newid()與newsequentialid()作爲「默認值或綁定」的區別/含義和/或優缺點有哪些。newid()vs newsequentialid()有什麼區別/優點和缺點?

我知道的唯一區別是newid()創建一個新的隨機GUID而不是newsequentialid(),它以基於表中最後一個以遞增方式創建的新GUID。

回答

23

據我所知,當你在一行中插入一個DB時,它將按照相對於表中其他PK的順序插入。用正常的指導,這可能在桌子上的任何地方。 newsequentialid()將始終添加到表的末尾。

因此插入的性能得到了改善。

This site解釋了兩種不同方法之間的差異和基準。

更新 - 引用的博客文章已被移動。該鏈接現在指的是一個web.archive.org鏈接。這裏的關鍵是外賣:

enter image description here

最引人注目的是由NEWID系統功能所需的寫入次數。這與69%的平均頁面密度相結合,證明了插頁在葉級別隨機分佈引起的頁面分裂。一旦頁面填滿,它需要分成兩頁,每頁50%,以便插入完成。不僅頁面分割導致頁面密度不佳,而且還嚴重地破壞了數據頁面(下一個數據頁面不與當前頁面相鄰的概率爲99%)。在我們的測試中,頁面拆分所需的空閒頁面的最可能位置是在表格的末尾,而不管行被插入的位置。因此,要讀取行以便掃描需要在廣泛分佈的拆分頁面之間來回跳動,因此出現令人震驚的碎片。

--Stefan Delmarco

+0

咦?如果它們是按照順序生成的那麼如何保證生成的GUID實際上是唯一的,而不僅僅是看起來像GUID的東西? – Justin 2010-02-18 15:00:18

+4

@Jinging - 沒有*保證* GUID是唯一的,它很可能是。 – 2012-12-29 19:02:26

+1

鏈接是易變的... Fotia現在404s在答案中的鏈接。 – 2014-05-13 18:52:30

-2

據我所知,NEWID()按隨機順序生成GUIDNEWSEQUENTIALID()按順序生成GUIDNEWSEQUENTIALID()只能在表格的默認子句中使用。

+2

你沒有添加任何東西,已經寫在題。 – 2014-02-12 03:14:53

1

從我的理解,當SQL實例啓動時,NEWSEQUENTIALID GUID被初始化爲一個隨機值。然後,對於其操作的生命週期,GUID在中央GUID上遞增,而不是通過查看爲該表生成的最後一個GUID。

+1

這樣做的好處是在索引中。完全隨機的GUID將索引分段得太多,順序的GUID有助於插入和索引性能。 – Todd 2011-06-24 05:17:05

+0

[Microsoft聲明](https://msdn.microsoft.com/da-dk/library/ms189786.aspx)它是順序的,關於自主機上次啓動以來生成的最後一個GUID。 – 2016-12-15 21:31:17

9

關於序列密鑰(如身份,序列和NEWSEQUENTIALID)與非序列密鑰(與NEWID或自定義隨機密鑰生成器一樣)的使用,有幾個方面需要考慮。

從順序鍵開始,所有行都進入索引的右端。當頁面已滿時,SQL Server將分配一個新頁面並填充它。這會減少索引中的碎片,這對讀取性能有利。另外,單個會話加載數據時插入速度會更快,並且數據駐留在單個驅動器或少量驅動器上。

但是,對於擁有多個主軸的高端存儲子系統,情況會有所不同。從多個會話中加載數據時,最終會發生頁面鎖存爭用(鎖存器是用於同步數據庫頁面訪問的對象),而不是索引葉級別鏈接列表的最右側頁面。此瓶頸會阻止使用存儲子系統的全部吞吐量。 請注意,如果您決定使用順序鍵並使用數字鍵,則始終可以使用該類型中的最低值來使用整個範圍。例如,您可以以-2,147,483,648開頭,而不是以INT類型中的1開頭。

考慮非連續密鑰,例如用NEWID或自定義解決方案生成的隨機密鑰。當試圖強制一行進入一個已經完整的頁面時,SQL Server執行一個經典的頁面拆分 - 它分配一個新頁面並將原始頁面的一半行移動到新頁面。頁面拆分具有成本,加上會導致索引碎片化。索引碎片可能會對讀取的性能產生負面影響。但是,就插入性能而言,如果存儲子系統包含許多主軸並且您正在加載來自多個會話的數據,則隨機順序實際上可能比順序更好,即使分割也是如此。

這是因爲在索引的右端沒有熱點,您可以更好地使用存儲子系統的可用吞吐量。展示這一策略的基準的一個很好的例子可以在Thomas Kejser的博客http://blog.kejser.org/2011/10/05/boosting-insert-speed-by-generating-scalable-keys/中找到。

來源: 查詢的Microsoft®SQL 2012SERVER®考試 70-461 培訓工具包

相關問題