列ストアインデックスの行グループの状態情報を出力する:SQL Server動的管理ビューレファレンス(112)
「Microsoft 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.
関連記事
- SQL Serverの動的管理ビューとは?
「Microsoft SQL Server」が稼働するデータベースシステムを運用する管理者に向け、「動的管理ビュー」の活用を軸にしたトラブル対策のためのノウハウを紹介していきます。 - 「DMV(Dynamic Management View)」でパフォーマンス遅延の「原因」を調べる
本連載は、「Microsoft SQL Server」で発生するトラブルを「どんな方法で」「どのように」解決していくか、正しい対処のためのノウハウを紹介します。今回は、「処理遅延の原因を追求する“DMVの使い方”」を説明します。 - SQL Serverの動きを制御する「トレースフラグ」とは何か
「Microsoft SQL Server」が稼働するデータベースシステムを運用する管理者に向け、「トレースフラグ」の活用を軸にしたトラブル対策のためのノウハウを紹介していきます。初回は「トレースフラグとはそもそも何か」を解説します。