ヒープテーブルにレコードを挿入するときのSQL Serverの動作を理解しようとしています。 SQL Serverについて ブログの投稿によると、段落2 "SQL Serverは、サイズが20%(8,060バイト* 0.2 = 1,612バイト)のページサイズ。 "
ステートメントを正しく理解している場合、テーブルに2025バイトのサイズのレコードがある場合、2番目のレコードは別のページに移動する必要があります。しかし、私のテストはそれに同意していません
セットアップスクリプト
環境:SQL 2019 x64 Developerエディション。
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%のページサイズステートメントとは一致しません。
挿入後にDBCC PAGEの結果を確認しようとしましたが、DBCC PAGEの結果では挿入されたレコードのサイズが合計されません。
SETUPスクリプト
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%がいっぱいであることを示しています。なぜですか? 2番目の挿入を発行し、ページを確認します
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
);
このブログ投稿を書いた人に明確にしてもらいましょう:)
あなたの引用は文脈から少し外れています。完全な段落は次のとおりです。
たとえば、データページに4,100バイトのデータが格納されていて、結果として3,960バイトの空き容量がある場合、PFSはページの51〜80%がいっぱいであることを示します。 SQL Serverは、サイズがページサイズの20%(8,060バイト* 0.2 = 1,612バイト)を超える場合、新しい行をページに配置しません。
基本的に、ページに80_PCT_FULLフラグがある場合、SQL Serverは、ページが最大80%使用されており、利用可能なバイト数が1,612バイトしかないことを想定しています。
テストにより、次のことが確認されました。
これで状況が明確になることを願っています。