SQL Server には Allocation Page として、PFS / GAM / SGAM / IAM / DCM / BCM というような管理ページがあります。
SQL Server のページ情報のヘッダには、[m_prevPage] [m_nextPage] という前ページ、次ページの情報が格納されています。
Allocation Page がフルになった時に、このヘッダ情報がどのようになるのだろうということが気になり調べてみました。
■ページヘッダを取得してテーブル化
ページヘッダは [DBCC PAGE] を使用して取得することが可能です。
以下のようなクエリで取得可能です。
DBCC TRACEON(3604) |
DBCC PAGE の実行結果は、[WITH TABLERESULTS] を使用することで表形式で取得することができます。
ヘッダ情報を [INSERT INTO ~ EXEC (‘DBCC PAGE ~’)] でテーブルに格納すると、ヘッダ情報が調べやすくなると思い、以下のようなクエリを作ってみました。
SET NOCOUNT ON DECLARE @tbl Table( DECLARE @DBCCTbl Table ( DECLARE @stratpage int = 1 /* WHILE (@stratpage <= @endpage) SELECT * FROM @DBCCTbl WHERE m_type = @pagetype ORDER BY no ASC |
stratpage と endpage で検索するページの範囲を指定して、pagetype で検索する Allocation Page の種類を指定します。
pagetype の種類に関してはコメントでクエリ内に記載していますが、このような種類があります。
# pagetype に関しては、Internals Viewer for SQL Server のソースコードを参考にさせていただいています。
# 初期の情報格納を nvarchar(50) にしてしまっていたり、INSERT 時に暗黙の型変換が発生しているはずだったりと結構荒い作りですが。
■m_prevPage と m_nextPage
SQL Server のテーブルのレコードはページの集まりとなっています。
ページ間はページヘッダの m_prevPage / m_nextPage でつながれています。
前や先にページが無い場合は 0 となります。
それでは、先ほどのクエリを使用してデータページ (m_type=1) の m_prevPage と m_nextPage を見たいと思います。
データを断片化しないように INSERT していますのできれいにページが連続して並んでいる状態になっています。
# このページの連続性が崩れていると論理スキャンフラグメンテーションが発生している状態となります。
データページ関しては、m_prevPage と m_nextPage を使用してページ間のリンクが設定されていることが確認できますね。
■Allocation Page のページリンク
それでは、PFS 等の Allocation Page で m_prevPage と m_nextPage の情報を取得して、ページリンクの状態を調べてみたいと思います。
1~30,000 ページの中に PFS ページ (m_type=11) で管理する Allocation Page) がどれぐらい含まれているかを取得してみます。
実行結果がこちら。
PFS ですが、8,088 ページごとに存在しているのが上記の結果から確認ができます。
同様に GAM / DCM のページ情報も取得してみたいと思います。
# 2 ページ目の GAM / DCM は8,088 ページより離れた間隔で存在しているのでクエリはちょっと変更しています。
PFS は 8,088 ページごとに存在していますが、511,000 ページ以上離れた間隔で存在しています。
PFS は [Page Free Space] という名称があらわすようにページ単位で空き領域を管理しています。
GAM / DCM (SGAM / BCM も) はエクステント単位で領域を管理しています。
そのため、ページが存在する間隔も変わってきています。
# PFS は 64MB 分のページを管理、GAM / DCM は 4GB 分のエクステントを管理しています。
Data Page とは異なり、PFS / GAM / DCM では m_prevPage / m_nextPage を使用したページリンクの管理はされていないみたいですね。
IAM に関しては Data Page と同様の管理となっているようです。
以前から、PFS 等のページの連続性ってどうなっているのかが気になっていたのですが調べる方法が見えてきてちょっとすっきりしました。
[…] PFS / GAM / DCM / は何ページごとに存在する?? に続いて疑問に思ったので調べてみましたシリーズです。 […]
リソースガバナーで制御されているメモリはどの領域?? « SE の雑記
20 3月 11 at 21:15