亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

使用NEWSEQUENTIALID解決GUID聚集索引問題 SQLS

系統 2036 0

UNIQUEIDENTIFIER做主鍵(Primary Key)是一件很方便的事情,在數據合并等操作中有不可替代的優勢
但是由于普通的GUID的分散性使得如果主鍵加上聚集索引(Clustered Index)會導致在插入記錄時效率大大降低

SQL SERVER 2005中新增了一個NEWSEQUENTIALID的函數,MSDN的解釋是:
在指定計算機上創建大于先前通過該函數生成的任何 GUID 的 GUID。
NEWSEQUENTIALID() 不能在查詢中引用。
注:即只能做為數據庫列的DEFAULT VALUE,不能執行類似SELECT NEWSEQUENTIALID()的語句
只有當計算機沒有網卡時,NEWSEQUENTIALID() 生成的 GUID 才在該特定計算機中是唯一的。
注:這句話是錯誤的,應該是只有只有當計算機有網卡時,生成的GUID才是全球唯一
您可以使用 NEWSEQUENTIALID() 生成 GUID 以減少葉級別索引上的頁爭用。

但是使用NEWSEQUENTIALID卻不是那么一帆風順
1. 如何獲得生成的GUID
如果生成的GUID所在字段做為外鍵要被其他表使用,我們就需要得到這個生成的值
通常,PK是一個IDENTITY字段,我們可以在INSERT之后執行 SELECT SCOPE_IDENTITY()來獲得新生成的ID
但是由于NEWSEQUENTIALID()不是一個INDETITY類型,這個辦法是做不到了,而他本身又只能在默認值中使用,不可以事先SELECT好再插入,那么我們如何得到呢?有以下兩種方法:

-- 1.定義臨時表變量
DECLARE @outputTable TABLE (ID uniqueidentifier )
INSERT INTO TABLE1(col1,col2)
OUTPUTINSERTED.ID
INTO @outputTable
VALUES ( ' value1 ' , ' value2 ' )
SELECT ID FROM @outputTable

-- 2.標記ID字段為ROWGUID(一個表只能有一個ROWGUID)
INSERT INTO TABLE1(col1,col2)
VALUES ( ' value1 ' , ' value2 ' )
-- 在這里,ROWGUIDCOL其實相當于一個別名
SELECT ROWGUIDCOL FROM TABLE1


2. 如何設定DEFAULT VALUE為NEWSEQUENTIALID()
通過UI的方式設定默認值時,由于SQL SERVER 2005的BUG(即使是SP2也沒有解決),導致我們設置了默認值為NEWSEQUENTIALID()保存時會出現以下錯誤:
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'
有兩種方式可以解決:要么直接點Yes,要么通過CREATE TABLE語句來建表。

通過客戶端的方式,也可以通過調用windows api產生sequential的guid,雖說可以省去上面提到的兩種麻煩,但是經過我測試,效果不是那么好。
我建立了一個表有ID和TIMESTAMP兩個字段,用NEWSEQUENTIALID()和客戶端兩種方法生成記錄,并按ID和TIMESTAMP兩種方式進行排序。
NEWSEQUENTIALID()版本的結果永遠一樣。而客戶端生成就有一些問題,如果連續運行程序,表現良好,如果間隔一段時間后繼續運行,新生成的記錄就不一定大于之前生成的記錄,而每次間隔之間連續運行的部分,仍然表現良好。
客戶端生成sequential guid代碼如下

1 public static class SequentialGuid
2 {
3 [DllImport( " rpcrt4.dll " ,SetLastError = true )]
4 static extern int UuidCreateSequential( out Guidguid);
5
6 public static GuidNewGuid()
7 {
8 const int RPC_S_OK = 0 ;
9
10 Guidguid;
11 int result = UuidCreateSequential( out guid);
12 if (result != RPC_S_OK)
13 {
14 throw new ApplicationException( " Createsequentialguidfailed: " + result);
15 }

16
17 return guid;
18 }

19 }

使用NEWSEQUENTIALID解決GUID聚集索引問題 SQLServer數據表主鍵的另一個方案


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲精品久久午夜香蕉 | 成人做爰毛片免费视频 | 日本免费新一区二区三区 | 亚洲sss综合天堂久久久 | 亚洲国产精品一区二区第四页 | 免费观看黄a一级视频日本 免费观看黄色 | 日日摸夜夜摸狠狠摸97 | 久久久综合九色合综国产 | 美女黄色免费在线观看 | 国产一区二区播放 | 国产成综合 | 人人爽天天碰天天躁夜夜躁 | 精品四虎免费观看国产高清 | 日韩中文字幕视频在线观看 | 免费一级毛片不卡在线播放 | 欧美最猛性xxxxx短视频 | 日韩免费高清 | 天天躁夜夜躁狂狂躁综合 | 99久久精品免费看国产情侣 | 久久高清免费视频 | 久久www免费人成看片色多多 | 波多野结衣免费一区二区三区香蕉 | 日日夜夜精品视频 | www久久只有这里有精品 | 国产一级二级三级 | 久久综合色综合 | 看真人视频一一级毛片 | 国内精品视频一区 | 69久成人做爰视频 | 亚洲欧美日韩在线一区二区三区 | 不卡中文字幕 | 老司机午夜视频在线观看 | 骚婷婷 | 国产永久免费高清动作片www | 久久综合九色综合国产 | 欧美一区二区在线观看视频 | 天天爽天天干 | 日韩中文精品亚洲第三区 | 手机看片久久国产免费不卡 | 亚洲七七久久精品中文国产 | 精品视频www |