在爲主鍵選擇GUID和標識INT ...插入的GUID PK需要更長的時間並導致分頁?
確實,插入的GUID將花費更長的時間,因爲它必須搜索索引中的順序位置以放置該GUID?而且這可能會導致分頁?
如果這是真的,也許我們應該一直使用身份INT?
謝謝。
在爲主鍵選擇GUID和標識INT ...插入的GUID PK需要更長的時間並導致分頁?
確實,插入的GUID將花費更長的時間,因爲它必須搜索索引中的順序位置以放置該GUID?而且這可能會導致分頁?
如果這是真的,也許我們應該一直使用身份INT?
謝謝。
確實,新的GUID值可能小於先前插入的GUID值。是的,足夠的這些可以強制索引擴大頁面。 INT或BIGINT自動增量/標識列不會遇到這種情況,除非手動插入標識爲插入ON的較低標識。
,如果你不能從某種原因GUID更改退房 NEWSEQUENTIALID() http://msdn.microsoft.com/en-us/library/ms189786.aspx 它會找到比以前使用GUID更大。需要注意的是,「重大」部分只有在機器重新啓動之後纔會成立。
布拉德
我想你的意思是聚集索引遠遠超過主鍵。當然,使用NEWID()
時,任何索引都會很快分片,因爲這些值不會增加,因此會導致分頁。
我公司提供的這裏不連續的INSERT操作的效果相當詳細的解釋:
What is fragmenting my index on a table with stable traffic?
是,NEWSEQUENTIALID()
是好得多,至少在GUID的方面,因爲它是連續的,但是,它不是頁面拆分的保證。問題是,起始值是根據重新啓動服務器時重置的值確定的。因此,重新啓動後,新的連續範圍可以低於先前的第一條記錄。在這一點上的第一個插入將導致頁面拆分,但從那裏應該罰款。
此外,UNIQUEIDENTIFIER爲16字節,而INT爲4,甚至BIGINT爲8.增加的大小使每行佔用更多空間,因此每個8k數據頁上的行數更少。分配新頁面需要時間,尤其是如果您需要擴大數據文件以適應新頁面(並且行越大,數據文件填充的速度越快)。因此,是的,你很可能應該從INT IDENTITY
開始。
在這種情況下,需要外部和/或便攜式標識符(這是GUID非常方便的地方),那麼您仍然應該以INT(甚至BIGINT)IDENTITY字段作爲聚集PK並且具有另一列是放置在其上的唯一索引的GUID。這被稱爲替代鍵,在這些情況下效果很好。
我從「隨機」指導移動到連續指導...,對性能有很大的影響。我也使用這個用於客戶端連續guid生成。 http://stackoverflow.com/questions/211498/is-there-a-net-equalent-to-sql-servers-newsequentialid – granadaCoder 2014-11-06 18:22:39