SQLSERVER如何使用遞增排序的GUID做主鍵

2022-03-28 10:56:19 字數 2400 閱讀 9399

場景:

產品表資料量較大想用guid做表的主鍵,並在此字段上建立聚簇索引。 因為guid是隨機生成的,生成的值大小是不確定的,每次生成的數可能很大,也可能很小。這樣會影響插入的效率

1.newsequentialid和newid()的區別

newsequentialid() 和 newid()都可以產生uniqueidentifier型別的,guid.newid()產生的guid是無序的,隨機的。

而newsequentialid()是sql server2005新特性,newsequentialid是基於硬體(一定程度上)生成的guid以十六進製制間隔遞增.

官方的解釋?

sql server 2005中新增了乙個newsequentialid的函式,msdn的解釋是:

在指定計算機上建立大於先前通過該函式生成的任何 guid 的 guid。

newsequentialid() 不能在查詢中引用,不能執行類似select newsequentialid()的語句;

它只能與 uniqueidentifier 型別表列上的 default 約束一起使用。

只有當計算機沒有網絡卡時,newsequentialid() 生成的 guid 才在該特定計算機中是唯一的,反之只有當計算機有網絡卡時,生成的guid才是全球唯一。

差異性?

1.newsequentialid 函式比起 newid 函式最大的好處是:如果你在乙個 uniqueidentifier 欄位上建立索引,使用

newid 產生的新的值是不固定的,所以新的值導致索引b+樹的變化是隨機的。而 newsequentialid

產生的新的值是有規律的,則索引b+樹的變化是有規律的,以減少葉級別索引上的頁爭用。有規律和無規律就會帶來效能的改進。

2.uniqueidentifier做主鍵(primary key)是一件很方便的事情,在資料合併等操作中有不可替代的優勢

但是由於普通的guid的分散性使得如果主鍵加上聚集索引(clustered index)會導致在插入記錄時效率大大降低

原因很簡單:

1、快取的命中率問題

你可以參看我之前寫的這篇文章:理解快取

當每次產生的guid是有規律時,找到需要操作的葉子節點的幾個中間節點,可能已經在之前的訪問中被快取了。

這樣,系統不需要大量的讀入快取命中率很低的索引資料頁,這樣可以節省記憶體,同時提高搜尋速度。

2、連續和不連續的磁碟 i/o 操作對效能的影響

我們都知道,現在很多業務邏輯的瓶頸是硬碟的速度。而硬碟速度提公升的空間仍然不大。下面對硬碟讀寫操作的一些法則對我們優化跟硬碟i/o有關的方面很有幫助。

請記住下面的經驗法則:標準的 wide ultra scsi-3 硬碟每秒鐘可為 windows 和 sql server

提供75個不連續(隨機)的 i/o 操作和 150 個連續的 i/o 操作。這種硬碟的標稱傳輸率在 40

mb/秒左右。請記住更有可能限制資料庫伺服器的傳輸率是每秒鐘 75/150 i/o,而不是 40 mb/秒。

讀/寫磁頭和相關的磁碟取數臂需要移動才能在 sql server 和 windows

所要求的硬碟碟片的位置上進行查詢和操作。如果資料所在的硬碟碟片的位置不連續,硬碟驅動器要花多得多的時間才能將磁碟取數臂和讀/寫磁頭移動到所有需要的硬碟碟片位置。如果所需要的資料全部位於硬碟碟片上的連續物理扇區,情況則相反,磁碟取數臂和讀/寫磁頭只需進行很小的移動就能完成所需磁碟

i/o 操作。連續和不連續的情況下所花的時間有很大的差異,每個不連續的資料查詢大約要花 50 毫秒,而連續的資料查詢則只需大約 2-3

毫秒。請注意這些值是粗略估計出來的,具體值將取決於不連續的資料在磁碟上分布的疏密、硬碟碟片的旋轉速度

(rpm) 以及硬碟的其它物理屬性。主要要記住的一點是連續 i/o 有益於 sql server 效能。之前已提到標準的硬碟支援每秒 75

個不連續的 i/o 和每秒 150 個連續的 i/o。還要記住的重要一點是讀或寫 8kb 的時間與讀或寫 64 kb的時間幾乎相同。在 8 kb

到 64 kb 範圍之內,單個磁碟 i/o 傳輸操作所花的時間主要是磁碟取數臂和讀/寫磁頭運動的時間。因此,從數學上來講,當需要傳輸 64

kb 以上的 sql 資料時,盡可能地執行 64 kb 磁碟傳輸是有益的,因為 64

kb 傳輸基本上與 8 kb 傳輸一樣快,而每次傳輸的 sql server 資料是 8 kb 傳輸的 8 倍。請記住 read-ahead

manager 以 64 kb 位元組片(也稱為 sql server 擴充套件盤區)執行磁碟操作。log manager 也以較大的 i/o

傳輸量來執行連續寫操作。要記住的主要事項是充分利用 read-ahead manager,並將 sql server

日誌檔案與其它非連續訪問的檔案分開,以有效提高 sql server 的效能。

SQL SERVER 中如何使用鎖

多個使用者同時對資料庫的併發操作時會帶來以下資料不一致的問題 併發控制的主要方法是封鎖,鎖就是在一段時間內禁止使用者做某些操作以避免產生資料不一致 sql server支援的鎖粒度可以分為為行 頁 鍵 鍵範圍 索引 表或資料庫獲取鎖 一.為什麼要引入鎖 多個使用者同時對資料庫的併發操作時會帶來以下資...

SQL Server如何使用表變數

參考前乙個例項使用output儲存更新記錄前後資料 改用乙個表變數來實現。首先定義乙個表變數 declare salaryreport table memberid int name nvarchar 100 oldsalary decimal 18,6 newsalary decimal 18,6...

如何使用SQL Server 2000全文檢索

一 如何在sql中啟用全文檢索功能 1 驗證全文檢索服務是否安裝 通過儲存過程fulltextserviceproperty 返回有關全文服務級別屬性的資訊 來驗證搜尋服務 全文元件 是否安裝。如select fulltextserviceproperty isfulltextinstalled 返...