UNIQUEIDENTIFIER做主鍵(Primary Key)是一件很方便的事情,在數(shù)據(jù)合并等操作中有不可替代的優(yōu)勢(shì)
但是由于普通的GUID的分散性使得如果主鍵加上聚集索引(Clustered Index)會(huì)導(dǎo)致在插入記錄時(shí)效率大大降低
SQL SERVER 2005中新增了一個(gè)NEWSEQUENTIALID的函數(shù),MSDN的解釋是:
在指定計(jì)算機(jī)上創(chuàng)建大于先前通過(guò)該函數(shù)生成的任何 GUID 的 GUID。
NEWSEQUENTIALID() 不能在查詢中引用。
注:即只能做為數(shù)據(jù)庫(kù)列的DEFAULT VALUE,不能執(zhí)行類似SELECT NEWSEQUENTIALID()的語(yǔ)句
只有當(dāng)計(jì)算機(jī)沒(méi)有網(wǎng)卡時(shí),NEWSEQUENTIALID() 生成的 GUID 才在該特定計(jì)算機(jī)中是唯一的。
注:這句話是錯(cuò)誤的,應(yīng)該是只有只有當(dāng)計(jì)算機(jī)有網(wǎng)卡時(shí),生成的GUID才是全球唯一
您可以使用 NEWSEQUENTIALID() 生成 GUID 以減少葉級(jí)別索引上的頁(yè)爭(zhēng)用。
但是使用NEWSEQUENTIALID卻不是那么一帆風(fēng)順
1. 如何獲得生成的GUID
如果生成的GUID所在字段做為外鍵要被其他表使用,我們就需要得到這個(gè)生成的值
通常,PK是一個(gè)IDENTITY字段,我們可以在INSERT之后執(zhí)行 SELECT SCOPE_IDENTITY()來(lái)獲得新生成的ID
但是由于NEWSEQUENTIALID()不是一個(gè)INDETITY類型,這個(gè)辦法是做不到了,而他本身又只能在默認(rèn)值中使用,不可以事先SELECT好再插入,那么我們?nèi)绾蔚玫侥兀坑幸韵聝煞N方法:












2. 如何設(shè)定DEFAULT VALUE為NEWSEQUENTIALID()
通過(guò)UI的方式設(shè)定默認(rèn)值時(shí),由于SQL SERVER 2005的BUG(即使是SP2也沒(méi)有解決),導(dǎo)致我們?cè)O(shè)置了默認(rèn)值為NEWSEQUENTIALID()保存時(shí)會(huì)出現(xiàn)以下錯(cuò)誤:
Warning were encountered during the pre-save validation process, and might result in a failure during save. Do you want to continue attempting to save?
'Table1' Table
-Error validating the default for column 'Id'
有兩種方式可以解決:要么直接點(diǎn)Yes,要么通過(guò)CREATE TABLE語(yǔ)句來(lái)建表。
通過(guò)客戶端的方式,也可以通過(guò)調(diào)用windows api產(chǎn)生sequential的guid,雖說(shuō)可以省去上面提到的兩種麻煩,但是經(jīng)過(guò)我測(cè)試,效果不是那么好。
我建立了一個(gè)表有ID和TIMESTAMP兩個(gè)字段,用NEWSEQUENTIALID()和客戶端兩種方法生成記錄,并按ID和TIMESTAMP兩種方式進(jìn)行排序。
NEWSEQUENTIALID()版本的結(jié)果永遠(yuǎn)一樣。而客戶端生成就有一些問(wèn)題,如果連續(xù)運(yùn)行程序,表現(xiàn)良好,如果間隔一段時(shí)間后繼續(xù)運(yùn)行,新生成的記錄就不一定大于之前生成的記錄,而每次間隔之間連續(xù)運(yùn)行的部分,仍然表現(xiàn)良好。
客戶端生成sequential guid代碼如下

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

使用NEWSEQUENTIALID解決GUID聚集索引問(wèn)題 SQLServer數(shù)據(jù)表主鍵的另一個(gè)方案
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
