sys.dm_db_column_store_row_group_physical_stats (Transact-SQL)

適用対象: SQL Server 2016 (13.x) 以降 Azure SQL DatabaseAzure 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 を指定します。
状態 tinyint state_description関連付けられている ID 番号。

0 = 非表示

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: メモリ内テーブルの列ストアに対してのみ。 tail に 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 行を返します。

アクセス許可

テーブルに対するアクセス許可とVIEW DATABASE STATEデータベースに対するアクセス許可が必要CONTROLです。

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)