列ストアインデックスの行グループの状態情報を出力するSQL Server動的管理ビューレファレンス(112)

「Microsoft SQL Server」が稼働するデータベースシステムを運用する管理者に向け、「動的管理ビュー」の活用を軸にしたトラブル対策のためのノウハウを紹介していきます。今回は、列ストアインデックスの行グループの状態情報を出力する方法について解説します。

» 2022年05月23日 05時00分 公開
[伊東敏章@IT]

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

SQL Server動的管理ビュー一覧

 本連載では、「Microsoft SQL Server(以下、SQL Server)」で使用可能な動的管理ビューについて、動作概要や出力内容などを紹介していきます。今回は動的管理ビュー「sys.dm_db_column_store_row_group_physical_stats」における、列ストアインデックスの行グループの状態情報を出力する方法について解説します。対応バージョンは、SQL Server 2016以降と、「Azure SQL Database」「Azure SQL Managed Instance」です。

概要

 SQL Serverでは列ストアインデックスを使用して、列指向データ形式を使用したデータ格納や取得、管理ができます。従来のインデックスである行ストア形式のインデックスは、データをシークして特定の値を検索するクエリや、狭い範囲の値でのクエリを実行する場合に最適なパフォーマンスを発揮します。列ストアインデックスは、大規模なテーブルで、大量のデータをスキャンする分析クエリを実行するときにパフォーマンスが高くなります。

 列ストアインデックスでは、データは行グループ単位で管理されます。行グループは、同時に列ストア形式に圧縮される行のグループです。1つの行グループには、通常、行グループ当たりの最大行数である104万8576行が含まれます。

 「sys.dm_db_column_store_row_group_physical_stats」動的管理ビューを使用することで、接続しているデータベースの列ストアインデックスの行グループの一覧情報を出力できます。

 出力される行グループの情報には、圧縮中などの行グループの状態や作成方法、データ行数や作成日時などの情報が含まれています。

出力内容

列名 データ型 説明
object_id int テーブルのオブジェクトID
index_id int 列ストアインデックスのインデックスID
partition_number int この行グループを保持するテーブルパーティションのID
row_group_id int この行グループのID
パーティション内で一意の値
インメモリテーブルの場合は「-1」
delta_store_hobt_id bigint 行グループのデルタストアの「hobt_id」
行グループがデルタストアに存在しない場合は「NULL」
インメモリテーブルの末尾の場合は「NULL」
state tinyint 行グループの状態ID
 「0」=INVISIBLE
 「1」=OPEN
 「2」=CLOSED
 「3」=COMPRESSED
 「4」=TOMBSTONE
 インメモリテーブルの場合は、COMPRESSEDのみ
state_desc nvarchar(60) 「state」の説明
 「0」=INVISIBLE
ビルド中の行グループ
列ストアの行グループは、データの圧縮中はINVISIBLEになる。圧縮が完了すると、列ストアの行グループの状態はCOMPRESSEDに変更され、デルタストアの行グループの状態がCLOSEDからTOMBSTONEに変更する
 「1」=OPEN
新しい行を受け入れ中のデルタストアの行グループ
OPEN行グループは、行ストア形式のままであり、列ストア形式に圧縮されていない
 「2」=CLOSED
最大行数を含むデルタストア内の行グループ
列ストアに圧縮されるのを待機している状態
 「3」=COMPRESSED
列ストアに圧縮され格納されている行グループ
 「4」=TOMBSTONE
デルタストア内にあり、使用されなくなった行グループ
total_rows bigint 行グループに物理的に格納されている行の数
圧縮された行グループの場合、削除済みとしてマークされている行が含まれる
deleted_rows bigint 削除対象としてマークされている、圧縮された行グループに物理的に格納されている行の数
デルタストア内の行グループの場合は「0」
size_in_bytes bigint この行グループ内の全てのページの合計サイズ(バイト単位)
このサイズには、メタデータまたは共有辞書を格納するために必要なサイズは含まれていない
trim_reason tinyint 圧縮された行グループが行の最大数より少なくなる原因となった理由
 「0」=UNKNOWN_UPGRADED_FROM_PREVIOUS_VERSION
 「1」=NO_TRIM
 「2」=BULKLOAD
 「3」=REORG
 「4」=DICTIONARY_SIZE
 「5」=MEMORY_LIMITATION
 「6」=RESIDUAL_ROW_GROUP
 「7」=STATS_MISMATCH
 「8」=SPILLOVER
 「9」=AUTO_MERGE
trim_reason_desc nvarchar(60) 「trim_reason」の説明
 「0」=UNKNOWN_UPGRADED_FROM_PREVIOUS_VERSION
以前のバージョンのSQL Serverからアップグレードするときに発生した
 「1」=NO_TRIM
行グループはトリミングされなかった
行グループは最大104万8576行で圧縮された。デルタストア行グループが閉じられた後に行のサブセットが削除された場合、行の数は少なくなる可能性がある
 「2」=BULKLOAD
一括読み込みのバッチサイズによって行の数が制限された
 「3」=REORG
REORGコマンドの一部として強制圧縮された
 「4」=DICTIONARY_SIZE
辞書のサイズが大きくなりすぎて、全ての行をまとめて圧縮できなかった
 「5」=MEMORY_LIMITATION
全ての行をまとめて圧縮するのに十分な使用可能メモリがない
 「6」=RESIDUAL_ROW_GROUP
インデックス作成操作中に100万行未満の最後の行グループの一部として閉じられた
 「7」=STATS_MISMATCH
インメモリテーブルの列ストアのみ
統計の誤りにより、末尾が100万行以上あると示されていたが、圧縮された行グループは100万行未満になった
 「8」=SPILLOVER
インメモリテーブルの列ストアのみ
末尾に100万を超える適格行がある場合、残りの最後のバッチ行は、カウントが10万から100万の間の場合であれば圧縮される
 「9」=AUTO_MERGE
バックグラウンドで実行されているタプルムーバーマージ操作が、1つ以上の行グループをこの行グループに統合した
transition_to_compressed_state tinyint この行グループがデルタストアから列ストアの圧縮状態に移動した方法
 「1」=NOT_APPLICABLE
 「2」=INDEX_BUILD
 「3」=TUPLE_MOVER
 「4」=REORG_NORMAL
 「5」=REORG_FORCED
 「6」=BULKLOAD
 「7」=MERGE
transition_to_compressed_state_desc nvarchar(60) 「transition_to_compressed_state」の説明
 「1」=NOT_APPLICABLE
操作はデルタストアに適用されなかった。または、SQL Server 2016(13.x)以降にアップグレードする前に、行グループが圧縮されている
 「2」=INDEX_BUILD
インデックスの作成またはインデックスの再構築によって、行グループが圧縮された
 「3」=TUPLE_MOVER
バックグラウンドで実行されているタプルムーバーが、行グループを圧縮した。タプルムーバーは、行グループの状態がOPENからCLOSEDに変更された後に発生する
 「4」=REORG_NORMAL
再編成(ALTER INDEX...REORG)操作によって、終了した行グループがデルタストアから列ストアに移動された。タプルムーバーよりも早く移動された場合に発生する
 「5」=REORG_FORCED
行グループがデルタストアで開かれており、行を最大まで保持する前に列ストアに強制的に移動された
 「6」=BULKLOAD
一括読み込み操作によりデルタストアを使用せずに行グループを直接圧縮した
 「7」=MERGE
マージ操作で、1つ以上の行グループをこの行グループに統合し、列ストア圧縮を実行した
has_vertipaq_optimization bit VertiPaq最適化が使用されるかどうか
VertiPaq最適化では、行グループ内の行の順序を再配置してより高い圧縮を実現することにより、列ストアの圧縮を改善する
 「0」=いいえ
 「1」=はい
generation bigint この行グループに関連付けられている行グループの生成世代
created_time datetime2 この行グループが作成された時刻
「NULL」=インメモリテーブルの列ストアインデックスの場合
closed_time datetime2 この行グループが終了した時刻
「NULL」=インメモリテーブルの列ストアインデックスの場合

動作例

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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