web-dev-qa-db-ja.com

ヒープテーブル挿入

ヒープテーブルにレコードを挿入するときの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%のページサイズステートメントとは一致しません。

enter image description here

挿入後に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%がいっぱいであることを示しています。なぜですか? enter image description here 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
);

enter image description here

4
user1716729

このブログ投稿を書いた人に明確にしてもらいましょう:)

あなたの引用は文脈から少し外れています。完全な段落は次のとおりです。

たとえば、データページに4,100バイトのデータが格納されていて、結果として3,960バイトの空き容量がある場合、PFSはページの51〜80%がいっぱいであることを示します。 SQL Serverは、サイズがページサイズの20%(8,060バイト* 0.2 = 1,612バイト)を超える場合、新しい行をページに配置しません。

基本的に、ページに80_PCT_FULLフラグがある場合、SQL Serverは、ページが最大80%使用されており、利用可能なバイト数が1,612バイトしかないことを想定しています。

テストにより、次のことが確認されました。

  1. 最初のINSERTはページ416に到達しました。ページは50_PCT_FULLとしてマークされていました。つまり、最大4,030バイトが入力されている可能性があります。
  2. 2,025バイトの2番目のINSERTは、同じページに収まります。ただし、使用率が50%を超えており、ページは80_PCT_FULLとマークされていました。つまり、最大6,448バイトが読み込まれ、1,612バイトのみが無料であることが保証されました。
  3. 1,612バイトを超えて挿入しようとしたため、3番目の挿入は417ページに移動しました

これで状況が明確になることを願っています。

6
Dmitri K