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


場景:

產品表數據量較大想用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、緩存的命中率問題
你可以參看我之前寫的這篇文章:理解緩存 http://database.ctocio.com.cn/tips/219/7791219.shtml
當每次產生的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 的性能。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM