我试图了解 SQL Server 在将记录插入堆表时的行为。根据关于 sql Server的博客文章,第 2 段“如果页面大小超过页面大小的 20%(8,060 字节 * 0.2 = 1,612 字节),SQL Server 将不会向页面添加新行。 ”
如果我正确理解了该语句,那么如果该表有一条大小为 2025 字节的记录,则第二条记录应该放在另一页上。但是,我的测试不同意
设置脚本
环境:SQL 2019 x64 开发者版。
create table dbo.Heap(id INT, Val varchar(8000) not null);
GO
insert into dbo.heap(ID, val) values (1,replicate('*',2010));
insert into dbo.heap(ID, val) values (2,replicate('*',2010));
insert into dbo.heap(ID, val) values (3,REPLICATE('*',2010));
insert into dbo.heap(ID, val) values (4,REPLICATE('*',2010));
并运行以下代码
SELECT PARSENAME(REPLACE(REPLACE(REPLACE(CAST(sys.fn_PhysLocFormatter (%%physloc%%) AS varchar),')',''),'(',''),':','.'),2)PageNo,
sys.fn_PhysLocFormatter (%%physloc%%) AS [Location],* FROM heap ORDER BY [ID]
上述 SELECT 返回以下结果,与 20% page size 语句不符。
我尝试在插入后查看 DBCC PAGE 结果,但 DBCC PAGE 结果并没有增加插入记录的大小。
设置脚本
DROP TABLE IF EXISTS heap
go
create table dbo.Heap(id INT, Val varchar(8000) not null);
GO
insert into dbo.heap(ID, val) values (1,replicate('*',2010));
go
dbcc traceon(3604);
dbcc page
(
'demodb' -- Database name
,1 -- File ID
,416 -- Page ID
,1 -- Output mode: 3 - display page header and row details
);
记录大小仅为数据页的 25%,但 PFS 显示 50% 已满,为什么? 发布第二个插入并查看 PAGE
insert into dbo.heap(ID, val) values (2,replicate('*',2010));
dbcc page
(
'demodb' -- Database name
,1 -- File ID
,416 -- Page ID
,1 -- Output mode: 3 - display page header and row details
);
让写这篇博文的人澄清一下:)
你的报价有点断章取义。完整的段落是:
基本上,这意味着如果页面上有80_PCT_FULL标志,SQL Server 预计该页面可能填充了 80% 并且只有 1,612 字节可用。
您的测试证实:
希望这可以澄清情况。