sys.dm_db_column_store_row_group_physical_stats (Transact-SQL)

適用対象: SQL Server 2016 (13.x) 以降 Azure SQL Database Azure SQL Managed Instance

現在のデータベース内のすべての列ストア インデックスに関する現在の行グループ レベルの情報を提供します。

これにより、カタログ ビュー sys.column_store_row_groups (Transact-SQL)が拡張されます。

列名 データ型 説明
object_id int 基になるテーブルの ID。
index_id int テーブル上のこの列ストア インデックス object_id ID。
partition_number int row_group_idを保持するテーブル パーティションの ID。 partition_numberを使用して、この DMV を sys.partitions に参加させることができます。
row_group_id int この行グループの ID。 パーティション テーブルの場合、値はパーティション内で一意です。

メモリ内末尾の場合は -1。
delta_store_hobt_id bigint デルタ ストア内の行グループのhobt_id。

行グループがデルタ ストアにない場合は NULL。

メモリ内テーブルの末尾の場合は NULL。
state tinyint state_descriptionに関連付けられている ID 番号。

0 = INVISIBLE

1 = OPEN

2 = CLOSED

3 = COMPRESSED

4 = TOMBSTONE

COMPRESSED は、メモリ内テーブルに適用される唯一の状態です。
state_desc nvarchar(60) 行グループの状態の説明:

0 - INVISIBLE -ビルド中の行グループ。 例:
データが圧縮されている間、列ストアの行グループは非表示になります。 圧縮が完了すると、メタデータ スイッチによって列ストア行グループの状態が INVISIBLE から COMPRESSED に変更され、デルタストア行グループの状態が CLOSED から TOMBSTONE に変更されます。

1 - OPEN - 新しい行を受け入れるデルタストア行グループ。 開いている行グループは引き続き行ストア形式であり、列ストア形式に圧縮されていません。

2 - CLOSED - デルタ ストア内の行グループ。行の最大数が含まれており、タプル ムーバー プロセスによって列ストアに圧縮されるのを待機しています。

3 - COMPRESSED - 列ストア圧縮で圧縮され、列ストアに格納される行グループ。

4 - TOMBSTONE - 以前はデルタストアに存在し、使用されなくなった行グループ。
total_rows bigint 行グループに物理的に格納されている行の数。 圧縮された行グループの場合。 削除済みとしてマークされている行が含まれます。
deleted_rows bigint 削除対象としてマークされている圧縮行グループに物理的に格納されている行の数。

デルタ ストア内の行グループの場合は 0 です。
size_in_bytes bigint この行グループ内のすべてのページの合計サイズ (バイト単位)。 このサイズには、メタデータまたは共有ディクショナリを格納するために必要なサイズは含まれません。
trim_reason tinyint COMPRESSED 行グループが最大行数を下回る原因。

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 - スピルオーバー

9 - AUTO_MERGE
trim_reason_desc nvarchar(60) trim_reasonの説明。

0 - UNKNOWN_UPGRADED_FROM_PREVIOUS_VERSION: 以前のバージョンの SQL Server からアップグレードするときに発生しました。

1 - NO_TRIM: 行グループがトリミングされませんでした。 行グループは最大 1,048,576 行で圧縮されました。 デルタ行グループが閉じられた後に行のサブセットが削除された場合、行の数が少なくなる可能性があります

2 - BULKLOAD: 一括読み込みバッチ サイズによって行数が制限されます。

3 - REORG: REORG コマンドの一部としての強制圧縮。

4 - DICTIONARY_SIZE: 辞書のサイズが大きくなりすぎて、すべての行を一緒に圧縮する必要がありました。

5 - MEMORY_LIMITATION: すべての行をまとめて圧縮するのに十分なメモリがありません。

6 - RESIDUAL_ROW_GROUP: インデックスのビルド操作中に行が 100 万行 < 最後の行グループの一部として閉じられます。 注: 複数のコアを持つパーティション ビルドでは、この種類のトリミングが複数行われることがあります。

7 - STATS_MISMATCH: メモリ内テーブルの列ストアに対してのみ。 統計が正しく示されていない>= 末尾に 100 万行の修飾された行が見つかった場合、圧縮された行グループの行数は 100 万行<

8 - SPILLOVER: メモリ内テーブルの列ストアに対してのみ。 末尾に 100 万行の修飾行 > 場合、カウントが 100,000 から 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) 1 - NOT_APPLICABLE - 操作はデルタストアには適用されません。 または、SQL Server 2016 (13.x) にアップグレードする前に行グループが圧縮されていました。この場合、履歴は保持されません。

2 - INDEX_BUILD - インデックスの作成またはインデックスの再構築によって行グループが圧縮されました。

3 - TUPLE_MOVER - バックグラウンドで実行されているタプル ムーバーによって行グループが圧縮されました。 タプル ムーバーは、行グループの状態が OPEN から CLOSED に変更された後に発生します。

4 - REORG_NORMAL - 再編成操作、ALTER INDEX ...REORG は、CLOSED 行グループをデルタストアから列ストアに移動しました。 これは、タプルムーバーが行グループを移動する時間が発生する前に発生しました。

5 - REORG_FORCED - この行グループはデルタストアで開かれていたため、列ストアに強制的に入った後、完全な数の行が作成されました。

6 - BULKLOAD - 一括読み込み操作では、デルタストアを使用せずに行グループが直接圧縮されました。

7 - MERGE - 1 つ以上の行グループをこの行グループに統合し、列ストア圧縮を実行したマージ操作。
has_vertipaq_optimization bit VertiPaq の最適化では、行グループ内の行の順序を並べ替えて、より高い圧縮を実現することで、列ストアの圧縮が向上します。 この最適化は、ほとんどの場合自動的に行われます。 VertiPaq 最適化が使用されない場合は、次の 2 つがあります。
a. デルタ行グループが列ストアに移動し、列ストア インデックスに 1 つ以上の非クラスター化インデックスがある場合-この場合、VertiPaq の最適化はスキップされ、マッピング インデックスへの変更が最小限に抑えられます。
b. メモリ最適化テーブルの列ストア インデックスの場合。

0 = いいえ

1 = はい
bigint この行グループに関連付けられている行グループの生成。
created_time datetime2 この行グループが作成された時刻。

NULL - メモリ内テーブルの列ストア インデックスの場合。
closed_time datetime2 この行グループが閉じられた時刻。

NULL - メモリ内テーブルの列ストア インデックスの場合。

結果

現在のデータベースの行グループごとに 1 行を返します。

アクセス許可

テーブル CONTROL 権限とデータベースに対する VIEW DATABASE STATE 権限が必要です。

SQL Server 2022 以降でのアクセス許可

データベースに対する VIEW DATABASE PERFORMANCE STATE アクセス許可が必要です。

A. 断片化を計算して、列ストア インデックスを再構成または再構築するタイミングを決定します。

列ストア インデックスの場合、削除された行の割合は、行グループの断片化に適した尺度です。 断片化が 20% 以上の場合は、削除された行を削除します。 その他の例については、「 インデックスの整理と再構築を参照してください。

次の使用例は、 sys.dm_db_column_store_row_group_physical_stats を他のシステム テーブルと結合し、現在のデータベース内の各行グループの効率の見積もりとして Fragmentation 列を計算します。 1 つのテーブルに関する情報を検索するには、 WHERE 句の前にあるコメント ハイフンを削除し、テーブル名を指定します。

SELECT i.object_id,   
    object_name(i.object_id) AS TableName,   
    i.name AS IndexName,   
    i.index_id,   
    i.type_desc,   
    CSRowGroups.*,  
    100*(ISNULL(deleted_rows,0))/NULLIF(total_rows,0) AS 'Fragmentation'
FROM sys.indexes AS i  
JOIN sys.dm_db_column_store_row_group_physical_stats AS CSRowGroups  
    ON i.object_id = CSRowGroups.object_id AND i.index_id = CSRowGroups.index_id   
-- WHERE object_name(i.object_id) = 'table_name'   
ORDER BY object_name(i.object_id), i.name, row_group_id;  

参照

オブジェクト カタログ ビュー (Transact-SQL)
カタログ ビュー (Transact-SQL)
列ストア インデックスのアーキテクチャ
SQL Server システム カタログに対するクエリに関してよく寄せられる質問
sys.columns (Transact-SQL)
sys.all_columns (Transact-SQL)
sys.computed_columns (Transact-SQL)
sys.column_store_dictionaries (Transact-SQL)
sys.column_store_segments (Transact-SQL)