在上次的曲演雜壇--頁(yè)拆分中基于SQL SERVER 2008版本進(jìn)行了測(cè)試,在SQL Server 2012和SQL Server 2014版本中,對(duì)頁(yè)拆分進(jìn)行了優(yōu)化,避免了一次插入導(dǎo)致多次頁(yè)拆分的情況。
讓我們?cè)赟QL Server 2014版本中來(lái)測(cè)試下:
--=========================================--使用TestDB數(shù)據(jù)庫(kù)來(lái)測(cè)試USE TestDBGODROP TABLE TB01GO--=======================================--創(chuàng)建測(cè)試表TB01CREATE TABLE TB01( ID INT PRIMARY KEY, C1 NVARCHAR(MAX))GO--=======================================--插入420條數(shù)據(jù),所有數(shù)據(jù)存放在一個(gè)8KB的數(shù)據(jù)頁(yè)中INSERT INTO TB01(ID,C1)SELECT T.RID,N'C' FROM (SELECT ROW_NUMBER()OVER(ORDER BY object_id) AS RID FROM sys.all_columns) AS TWHERE T.RID<422AND T.RID<>418--====================================--====================================--插入一行數(shù)據(jù)INSERT INTO TB01(ID,C1)SELECT 418,REPLICATE(N'1',4000)--====================================--查看數(shù)據(jù)頁(yè)DBCC IND('TestDB','TB01',1)
--===================================--查看非葉子節(jié)點(diǎn)來(lái)查看數(shù)據(jù)和頁(yè)的對(duì)應(yīng)情況DBCC PAGE('TestDB',1,8104,3)
可以發(fā)現(xiàn),本次也拆分只創(chuàng)建了兩個(gè)新頁(yè)面,在ID=418的記錄插入時(shí),發(fā)現(xiàn)頁(yè)8012上無(wú)法存放新記錄,便對(duì)頁(yè)8012進(jìn)行拆分,將數(shù)據(jù)418之前的數(shù)據(jù)留在頁(yè)8012上,把418之后的數(shù)據(jù)放到新的頁(yè)面8105上,然后另外申請(qǐng)一個(gè)頁(yè)面存放要插入的ID=418記錄。
在SQL Server 2012和SQL Server 2014版本中,當(dāng)?shù)谝淮雾?yè)拆分后,還是無(wú)法插入新的數(shù)據(jù)行,那么會(huì)創(chuàng)建一個(gè)新頁(yè)來(lái)存放該記錄,以避免多次頁(yè)拆分。(尚不知道按照什么算法進(jìn)行第一次頁(yè)拆分)
--============================================
新聞熱點(diǎn)
疑難解答
圖片精選