Estou tentando entender o comportamento do SQL Server quando ele INSERT registro em uma tabela Heap. De acordo com a postagem do blog sobre o sql Server , o parágrafo 2 " O SQL Server não colocaria uma nova linha na página se seu tamanho exceder 20% (8.060 bytes * 0,2 = 1.612 bytes) do tamanho da página " .
Se eu entendi a declaração corretamente, se a tabela tivesse um registro de tamanho 2025 bytes, o segundo registro deveria ir para outra página. No entanto, meu teste não está concordando com isso
SCRIPT DE CONFIGURAÇÃO
Ambiente : SQL 2019 x64 Developer Edition.
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));
E execute o seguinte código
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]
O SELECT acima retorna o seguinte resultado, que não concorda com a declaração de tamanho de página de 20%.
Tentei revisar o resultado da DBCC PAGE após a inserção, mas o resultado da DBCC PAGE não soma o tamanho do registro inserido.
Script de CONFIGURAÇÃO
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
);
O tamanho dos registros era de apenas 25% da página de dados, no entanto, o PFS mostra 50% completo, por quê? Emita a segunda inserção e revise a PÁGINA
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
);
Deixe a pessoa que escreveu esta postagem no blog esclarecer :)
Sua citação está um pouco fora de contexto. O parágrafo completo é:
Basicamente, isso significa que, se você tiver o sinalizador 80_PCT_FULL na página, o SQL Server esperaria que a página tivesse até 80% de preenchimento e apenas 1.612 bytes disponíveis.
Seus testes confirmaram que:
Espero que isso esclareça a situação.