データベースファイルのページの詳細情報を出力するSQL Server動的管理ビューレファレンス(28)

「Microsoft SQL Server」が稼働するデータベースシステムを運用する管理者に向け、「動的管理ビュー」の活用を軸にしたトラブル対策のためのノウハウを紹介していきます。今回は、データベースファイルにおけるページの詳細情報の出力について解説します。

» 2021年07月26日 05時00分 公開
[伊東敏章@IT]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

SQL Server動的管理ビュー一覧

 本連載では、「Microsoft SQL Server(以下、SQL Server)」で使用可能な動的管理ビューについて、動作概要や出力内容などを紹介していきます。今回は動的管理関数「sys.dm_db_page_info」におけるデータベースファイルに関するページの詳細情報の出力について解説します。対応バージョンは、SQL Server 2019以降です。

概要

 SQL Serverでは、データベースのオブジェクトやユーザーデータはデータファイル(「.ndf」または「.mdf」)に記録されます。データの変更などのログ情報は、データファイルとは別に、トランザクションログファイルに記録されます。

 データファイルでは、「ページ」と呼ばれる8KBサイズの基本単位で、オブジェクトやユーザーデータへのストレージの割り当てを行います。ページは、「エクステント」と呼ばれる8ページ(64KB)をまとめた領域単位で、オブジェクトやユーザーデータへの割り当てを管理します。

 「sys.dm_db_page_info」動的管理関数を使用すると、データファイルに格納されているページについて、ページの種類やオブジェクトへの割り当て情報、格納されたデータ行数などの詳細な情報を出力できます。

構文と引数

構文 sys.dm_db_page_info (DatabaseId, FileId, PageId, Mode)

引数名 データ型 既定値 説明
DatabaseId smallint NULL データベースのIDを指定。NULLの場合エラーになる
FileId int NULL DatabaseIdで指定したデータベースのファイルのIDを指定。NULLの場合エラーになる
PageId int NULL FileIdで指定したファイル内のページのID番号を指定。NULLの場合エラーになる
Mode nvarchar(64) 'LIMITED' 出力の詳細レベルを指定。以下のいずれかの値を指定する
 ・'LIMITED'
 ・'DETAILED'
'DETAILED'を指定すると、より詳細な情報が出力される

出力内容

列名 データ型 説明
database_id int データベースID
file_id int ファイルID
page_id int ページID
page_header_version int ページヘッダバージョン
page_type int ページの種類
page_type_desc nvarchar(64) ページタイプの説明
page_type_flag_bits nvarchar(64) ページヘッダのタイプフラグビット
page_type_flag_bits_desc nvarchar(64) ページヘッダのタイプフラグビットの説明
page_flag_bits nvarchar(64) ページヘッダのフラグビット
page_flag_bits_desc nvarchar(256) ページヘッダのフラグビットの説明
page_lsn nvarchar(64) ログシーケンス番号/タイムスタンプ
page_level int インデックス内のページのレベル (leaf = 0)
object_id int ページを所有しているオブジェクトID
index_id int インデックスID (ヒープの場合は0)
partition_id bigint パーティションID
alloc_unit_id bigint アロケーションユニットID
is_encrypted bit ページが暗号化されているかどうかを示すビット
has_checksum bit ページにチェックサム値があるかどうかを示すビット
checksum int データ破損の検出に使用されるチェックサム値
is_iam_page bit ページがIAMページかどうかを示すビット
is_mixed_extent bit 混合エクステントに割り当てられているかどうかを示すビット
has_ghost_records bit ページにゴーストレコードが含まれているかどうかを示すビット
ゴーストレコードは、削除のマークが付けられているが、まだ削除されていないレコード
has_version_records bit ページにAcceleratedDatabaseRecoveryに使用されるバージョンレコードが含まれているかどうかを示すビット
pfs_page_id int 対応するPFSページのページID
pfs_is_allocated bit 対応するPFSページでページが割り当て済みとしてマークされているかどうかを示すビット
pfs_alloc_percent int PFSバイトで示される割り振りパーセント
pfs_status nvarchar(64) PFSバイト
pfs_status_desc nvarchar(64) PFSバイトの説明
gam_page_id int 対応するGAMページのページID
gam_status bit GAMに割り当てられているかどうかを示すビット
gam_status_desc nvarchar(64) GAMステータスビットの説明
sgam_page_id int 対応するSGAMページのページID
sgam_status bit SGAMに割り当てられているかどうかを示すビット
sgam_status_desc nvarchar(64) SGAMステータスビットの説明
diff_map_page_id int 対応する差分ビットマップページのページID
diff_status bit 差分ステータスが変更されたかどうかを示すビット
diff_status_desc nvarchar(64) 差分ステータスビットの説明
ml_map_page_id int 対応する最小ロギングビットマップページのページID
ml_status bit ページのログが最小かどうかを示すビット
ml_status_desc nvarchar(64) 最小ロギングステータスビットの説明
prev_page_file_id smallint 前ページファイルID
prev_page_page_id int 前のページのページID
next_page_file_id smallint 次ページファイルID
next_page_page_id int 次ページのページID
fixed_length smallint 固定サイズの行の長さ
slot_count smallint スロットの合計数(使用済みおよび未使用)
データページの場合、行数と同じ
ghost_rec_count smallint ページでゴーストとしてマークされたレコードの数
free_bytes smallint ページ上の空きバイト数
free_data_offset int データ領域末尾の空き容量のオフセット
reserved_bytes smallint すべてのトランザクションで予約されている空きバイト数(ヒープの場合)、ゴースト行の数(インデックスリーフの場合)
reserved_bytes_by_xdes_id smallint デバッグ目的でのみ使用
xdes_id nvarchar(64) デバッグ目的でのみ使用

動作例

 SQL Server 2019では、「sys.dm_exec_requests」と「sys.sysprocesses」に、「page_resource」列が追加されました。これらの動的管理ビューと「sys.dm_db_page_info」動的管理関数、「sys.fn_PageResCracker」システム関数とを組み合わせることで、各スレッドがロックやラッチにより待機しているページ情報を取得できます(図1)(図2)。

図1 図1 「sys.sysprocesses」と組み合わせることで、待機の発生したページ情報を取得できる
図2 図2 ページIOラッチの待機が発生したページの詳細情報を出力できる

 「sys.dm_db_page_info」動的管理関数が出力した情報を使用することで、ページIOラッチが発生したテーブルやパーティションを、「object_id」列や「partition_id」列の値を使用して特定できます。

 なお、ページ情報はロック待ちが発生した際にも表示されますが、ロック粒度がページロックの場合に限られます。キーロックなど、ページロックではない場合には「sys.dm_exec_requests」と「sys.sysprocesses」の「page_resource」列の値が「NULL」となり、ページ情報を表示できませんでした。直前の待機がページ関連の待機でない場合も「page_resource」列の値が「NULL」となりましたので、現在アクセス中のページ情報を取得するような使い方はできないようです。

※本Tipsは、「Windows Server 2019」上に「SQL Server 2019 CTP2」をインストールした環境を想定して解説しています。

筆者紹介

椎名 武史(しいな たけし)

日本ユニシス株式会社所属。Microsoft MVP for Data Platform(2017〜)。入社以来 SQL Serverの評価/設計/構築/教育などに携わりながらも、主にサポート業務に従事。SQL Serverのトラブル対応で社長賞の表彰を受けた経験も持つ。休日は学生時代の仲間と市民駅伝に参加し、銭湯で汗を流してから飲み会へと流れる。

伊東 敏章(いとう としあき)

日本ユニシス株式会社所属。入社以来SQL Server一筋で評価/設計/構築/教育などに携わりながらも、主にサポート業務に従事。社内のプログラミングコンテストで4回の優勝経験も持つ。趣味は輪行で週末は自転車を持っての旅行。目標は色々な日本百選を制覇すること。


Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

4AI by @IT - AIを作り、動かし、守り、生かす
Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。