在上次的曲演雜壇--頁拆分中基于SQL SERVER 2008版本進行了測試,在SQL Server 2012和SQL Server 2014版本中,對頁拆分進行了優化,避免了一次插入導致多次頁拆分的情況。
讓我們在SQL Server 2014版本中來測試下:
--=========================================--使用TestDB數據庫來測試USE TestDBGODROP TABLE TB01GO--=======================================--創建測試表TB01CREATE TABLE TB01( ID INT PRIMARY KEY, C1 NVARCHAR(MAX))GO--=======================================--插入420條數據,所有數據存放在一個8KB的數據頁中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--====================================--====================================--插入一行數據INSERT INTO TB01(ID,C1)SELECT 418,REPLICATE(N'1',4000)--====================================--查看數據頁DBCC IND('TestDB','TB01',1)
--===================================--查看非葉子節點來查看數據和頁的對應情況DBCC PAGE('TestDB',1,8104,3)
可以發現,本次也拆分只創建了兩個新頁面,在ID=418的記錄插入時,發現頁8012上無法存放新記錄,便對頁8012進行拆分,將數據418之前的數據留在頁8012上,把418之后的數據放到新的頁面8105上,然后另外申請一個頁面存放要插入的ID=418記錄。
在SQL Server 2012和SQL Server 2014版本中,當第一次頁拆分后,還是無法插入新的數據行,那么會創建一個新頁來存放該記錄,以避免多次頁拆分。(尚不知道按照什么算法進行第一次頁拆分)
--============================================
新聞熱點
疑難解答