-- 示例 1:使用聚簇索引
CREATE TABLE tbl5
(
i VARCHAR(900) NOT NULL
) ;
GO
CREATE CLUSTERED INDEX CIX_tbl5
ON tbl5 (i ASC) ;
GO
INSERT INTO tbl5
( i )
VALUES
( REPLICATE('a' , 900) )
, ( REPLICATE('b' , 900) )
, ( REPLICATE('c' , 900) )
, ( REPLICATE('d' , 900) )
, ( REPLICATE('e' , 900) )
, ( REPLICATE('f' , 900) )
, ( REPLICATE('g' , 900) )
, ( REPLICATE('h' , 900) ) -- 900 x 8 + (13 x 8) = 7200 + 104 = 7304
, ( REPLICATE('i' , 761) ) ;-- 7304 + 761 + 13
GO -- = 8078 + 96(Page Header) + 18 (Slot)
-- = 8192
-- m_freeCnt = 0
DBCC IND(tempdb,tbl5,-1) ; -- everything is IN_ROW_DATA
GO
DBCC TRACEON(3604) ;
GO
DBCC PAGE(tempdb,1,177,3) ;
GO
-- 示例 2:使用堆。当“i”列为 392 m_freeCnt = 387 时。当“i”= 393 时,我得到一个新页面。为什么我不能向“i”添加更多字节?
CREATE TABLE tbl6
(
i VARCHAR(900) NOT NULL
) ;
GO
INSERT INTO tbl6
( i )
VALUES
( REPLICATE('a' , 900) )
, ( REPLICATE('b' , 900) )
, ( REPLICATE('c' , 900) )
, ( REPLICATE('d' , 900) )
, ( REPLICATE('e' , 900) )
, ( REPLICATE('f' , 900) )
, ( REPLICATE('g' , 900) )
, ( REPLICATE('h' , 900) )
, ( REPLICATE('i' , 393) ) ;
GO
DBCC IND(tempdb,tbl6,-1);
GO
DBCC TRACEON(3604);
GO
DBCC PAGE(tempdb,1,181,3);
GO
'page split'和'heap'不应在同一句话中使用。你的意思是为什么大小为 393+change 的行不适合堆第一页的可用空间?这是因为 PFS 可用空间信息的分辨率不够高,请参阅管理范围分配和可用空间:
实际上,会适合页面,但 PFS 仅表示该页面为“95_PCT_FULL”,并且插入的记录相当大并且接近 PFS 的可用空间(8060 的 95% 是 403),因此 INSERT 选择分配一个新页面。
对于 B-Tree,由于键顺序,记录位置是确定的,因此引擎必须加载页面并检查可用空间,记录将适合。