亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

自增長的聚集鍵值不會擴展(scale)

2024-07-21 02:46:23
字體:
來源:轉載
供稿:網友
自增長的聚集鍵值不會擴展(scale)

如何選擇聚集鍵值的最佳實踐是什么?一個好的聚集鍵值應該有下列屬性:

  • 范圍小的(Narrow)
  • 靜態的(Static)
  • 自增長的(Ever Increasing)

我們來具體看下所有這3個屬性,還有在SQL Server里為什么自增長值實際上是不會擴展的。

范圍小的(Narrow)

聚集鍵值應該i越小越好。為什么?因為它要占用空間,聚集鍵值也在每個非聚集索引的葉子曾作為邏輯指針。如果你的聚集鍵值很廣,你的非聚集索引也會很大。如果你定義了非唯一非聚集索引(Non-Unique Non-Clustered Index)(基本上是這個情況),聚集鍵也是你非聚集索引導航結構的一部分。因此你的索引會變得很大。我們的目標是最小化我們的索引。因為我們要為此承擔更多的物理存儲,緩存池,這些都是SQL Server從存儲緩存讀取的索引頁的地方。

一般我們會選擇技術性鍵值(technical key value)(像INT/BIGINT數據類型),而不是自然鍵值(natural key value)。當我也看到很多長度有100 bytes甚至更長的聚集鍵值(包含LastName, FirstName, SocialSecurityNumber等)。相信我——你這是在浪費內存!沒有必要這樣做。選擇一個技術性鍵值就可以了。

靜態的(Static)

因為聚集鍵值在每個非聚集索引里都會復制一份,你的聚集鍵值應該從不改變!不然SQL Server需要經常維護,去更新執行計劃里每個在你表上定義的非聚集索引。你再次引入了你不需要的額外計算。把你的CPU用在其它重要的事情上。我們都知道,自然鍵值是會改變的(例如LastName列,當你結婚了就會改變)。

技術性鍵值(像INT IDENTITY)不會改變(默認)。因此在你非聚集索引里的邏輯指針(聚集鍵值格式)保持穩定——永遠沒有必要修改他們!

自增長的(Ever Increasing)

“好”的聚集鍵值第3個重要屬性是選擇列應該給你自增長的值。為什么?因為你總是在你聚集索引的末尾增加額外記錄,因此你可以避免昂貴的分頁(Page Splits)(涉及到CPU周期,事務日志等問題)和索引碎片。使用像INT IDENTITY自增長值列,在99%的情況下是沒有問題的,但還是有些情形,這個方法會導致嚴重的擴展性問題。假設你有個工作量,那里有很多不同用戶用自增長聚集鍵值對同個表永久插入鍵值。想下日志/審計表(Logging/Auditing Table)。

我們來仔細看下當你在內存里讀寫頁時,在SQL Server內部會發生什么。當SQL Server訪問特定內存機構(像存儲在緩存池里的頁)時,這些內存訪問必須被多個線程上同步。你不能在內存里并發寫入同個頁。當一個線程寫入一個頁時,其他一些線程同時就不能讀這個頁。另外并發編程你用互斥器(Mutexes)解決那個問題——像臨界區(Critical Section)。一些代碼路徑是人為互斥的。閂鎖(latches)用來在線程/查詢間的同步。每次當你讀一個頁,工作線程需要獲得共享鎖(Shared Latch(SH)),每次當你寫一個頁,工作線程需要獲得排它閂鎖(Exclusive Latch(EX))。而且這些閂鎖彼此是不兼容的。

當你進行INSERT語句時,工作線程在INSERT語句發生的頁獲得排它閂鎖。同時沒有線程可以從這個頁讀寫。使用自增長聚集鍵值這個方法實際上不會擴展,因為你在你聚集索引的末尾插入你的記錄。因此你的并行線程/查詢在你聚集索引里同個最后頁為閂鎖競爭。作為一個副作用SQL Server會連續執行你的INSERT語句——一個接著一個INSERT,你就碰到了著名的最后頁插入閂鎖競爭(Last Page Insert Latch Contention)。我們來看下面的圖片。

Last Page Insert

用自增長聚集鍵值的最佳實踐,在聚集鍵的末尾你有一個熱區。你的記錄越小,這里就會有更多的競爭。如果解決那個問題?簡單:把你的INSERT語句擴散到聚集索引的整個B樹結果。有很多方法可以實現這個:

  • 使用隨機聚集鍵值(像UNIQUEIDENTIFIER)。但要意識到副作用:在每個非聚集索引里邏輯指針更大,頁分裂問題……
  • 實現哈希分區(Hash Partitioning),如果你使用企業版本的SQL Server。
  • 使用SQL Server 2014里內不能優化表OLTP來剔除閂鎖。
  • 使用逆向索引(Reverse index),很遺憾SQL Server并不提供你像Oracle那樣的內建索引。你也可以自己寫一個的……
 1 CREATE FUNCTION BitReverse 2 ( 3     @Input bigint 4 ) 5 RETURNS bigint 6 AS 7 BEGIN 8     DECLARE @WorkValue bigint=@Input 9     DECLARE @Result bigint=0;10     DECLARE @Counter int=0;11     WHILE @Counter<6312     BEGIN13         SET @Result=@Result*214         IF (@WorkValue&1)=115         BEGIN16             SET @Result=@Result+117             SET @WorkValue=@WorkValue-118         END19         SET @WorkValue=@WorkValue/220         SET @Counter=@Counter+121     END22     23     RETURN @Result24     25 END
小結

使用像INT IDENTITY數據類型的范圍小,靜態的,自增長的聚集鍵值99%的情況都沒問題。但在一些有大量并發INSERT語句的情況(日志/審計表(Logging/Auditing Table)),用那個方法你會碰到最后也插入閂鎖競爭(Last Page Insert Latch Contention)。如果你碰到這個特定問題,你就會離開這99%的太平區域,你要保證INSERT語句散布到你的整個B樹結構?;旧夏憔驮谌绻麑⒍嗑€程散步到典型B樹結構做斗爭。

希望這篇文章可以幫助你從內部理解:為什么自增長聚集鍵值會傷及你表的擴展性。

感謝關注。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久免费观看视频| 亚洲精品免费在线视频| 亚洲在线观看视频网站| 欧美亚洲成人精品| 深夜福利亚洲导航| 国产精品福利小视频| 欧美最猛性xxxxx亚洲精品| 中文字幕日韩av综合精品| 中文字幕无线精品亚洲乱码一区| 国产精品久久9| 亚洲欧美日韩视频一区| 国产精品亚洲片夜色在线| 日韩电影在线观看免费| 国产精品久久国产精品99gif| 91精品国产综合久久久久久久久| 成人h猎奇视频网站| 97色在线视频| 亚洲色图日韩av| 97视频在线观看网址| 亚洲午夜未满十八勿入免费观看全集| 亚洲第一视频在线观看| www.精品av.com| 国产精品福利在线观看| 国产97在线|日韩| 91中文在线观看| 国产一区在线播放| 久久综合九色九九| 萌白酱国产一区二区| 久久亚洲一区二区三区四区五区高| 亚洲的天堂在线中文字幕| 亚洲电影中文字幕| 久久久人成影片一区二区三区观看| 亚洲综合国产精品| 2019国产精品自在线拍国产不卡| 久久久久久久久久久久av| 国产精品免费在线免费| 久久精品视频播放| 亚洲精品日韩欧美| 国产精品18久久久久久首页狼| 国产精品99免视看9| 欧美日韩一区二区三区| 日韩欧美在线国产| 91精品久久久久久久久久久| 亚洲深夜福利网站| 欧美第一淫aaasss性| 欧美性xxxxxxxxx| 亚洲精品久久久久久久久久久久久| 国产精品一区二区3区| 国产一区在线播放| 国产精品视频区1| 欧美亚洲第一页| 91高清视频在线免费观看| 久久五月情影视| 欧洲亚洲在线视频| 日韩精品极品视频| 国产一区二区三区视频| 国产欧美在线看| 精品丝袜一区二区三区| 91精品久久久久久久久青青| 国产欧亚日韩视频| 国产精品偷伦免费视频观看的| 亚洲欧洲成视频免费观看| 精品性高朝久久久久久久| 久久免费少妇高潮久久精品99| 国内精品400部情侣激情| 中文字幕日韩av综合精品| 欧美专区国产专区| 91美女片黄在线观| 一本大道香蕉久在线播放29| 久久伊人91精品综合网站| 欧美精品久久一区二区| 色妞久久福利网| 国模精品视频一区二区三区| 午夜精品久久久久久99热软件| 亚洲综合在线播放| 91精品免费视频| 亚洲精品日韩丝袜精品| 欧美另类69精品久久久久9999| 国产精品国产三级国产aⅴ浪潮| 国产精品女人网站| 国产一区二中文字幕在线看| 日韩av网站导航| 久久精品视频导航| 91在线免费视频| 韩国国内大量揄拍精品视频| 国产精品一区二区三区久久久| 亚洲欧美成人网| 成人国产精品av| 亚洲视频999| 91精品国产综合久久香蕉最新版| 国产精品入口福利| 亚洲欧美精品suv| 日韩精品欧美国产精品忘忧草| 国产一区视频在线| 欧美激情亚洲精品| 欧美二区在线播放| 欧美成人一区二区三区电影| 91福利视频网| 国产亚洲激情在线| 欧美视频在线免费| 亚洲欧美中文日韩v在线观看| 久久精品视频中文字幕| 国产97人人超碰caoprom| 姬川优奈aav一区二区| 日本成人激情视频| 97国产真实伦对白精彩视频8| 亚洲www在线观看| 日韩一区视频在线| 欧美亚洲日本黄色| 91久久久久久久久久久| 国产精品视频导航| 日韩免费电影在线观看| 欧美丰满少妇xxxxx做受| 欧美国产日韩一区二区在线观看| 久久成年人免费电影| 日韩精品视频免费专区在线播放| 另类图片亚洲另类| 久久免费少妇高潮久久精品99| 精品无码久久久久久国产| 91综合免费在线| 欧美最猛性xxxxx亚洲精品| 欧美在线观看网址综合| 欧美理论电影网| 色综合久久88色综合天天看泰| 久久九九热免费视频| 久久人人爽人人爽爽久久| 国产精品爽爽ⅴa在线观看| 欧美极品少妇与黑人| 欧美富婆性猛交| 理论片在线不卡免费观看| 欧美黑人又粗大| 91在线观看免费观看| 51ⅴ精品国产91久久久久久| 91精品国产成人| 一区二区三区天堂av| 成人激情春色网| 日韩av不卡电影| 亚洲男人的天堂网站| 欧美一级电影在线| 精品呦交小u女在线| 亚洲一区二区三区视频播放| 国产精品福利在线观看网址| 国产色视频一区| 91av中文字幕| 欧美专区国产专区| 国产亚洲欧美日韩美女| 国产精品白丝av嫩草影院| 国产精品丝袜久久久久久高清| 欧美日韩午夜剧场| 亚洲最新av在线| 668精品在线视频| 精品久久久久久中文字幕| 日韩高清电影好看的电视剧电影| 九九热最新视频//这里只有精品| 亚洲一区www| 国产亚洲成精品久久| 国产精品免费一区二区三区都可以| 成人免费观看a| 久久成年人免费电影| 欧美大片在线影院| 久久久国产视频91| 欧美激情图片区| 热久久美女精品天天吊色| 国产精品久久国产精品99gif|