sys.dm_db_column_store_row_group_physical_stats (Transact-SQL)

適用於: SQL Server 2016 (13.x) 和更新版本 Azure SQL DatabaseAzure SQL 受控執行個體

提供目前資料庫中所有資料行存放區索引的目前資料列群組層級資訊。

這會擴充目錄檢視 sys.column_store_row_groups(Transact-SQL)。

資料行名稱 資料類型 描述
object_id int 基礎資料表的識別碼。
index_id int object_id 資料表上這個資料行存放區索引的 識別碼。
partition_number int 保存 row_group_id 之資料表分割區的識別碼。 您可以使用partition_number將此 DMV 聯結至 sys.partitions。
row_group_id int 此資料列群組的識別碼。 對於資料分割資料表,值在資料分割內是唯一的。

-1 表示記憶體內部尾端。
delta_store_hobt_id bigint 差異存放區中資料列群組的hobt_id。

如果資料列群組不在差異存放區中,則為 Null。

記憶體內部資料表結尾的 Null。
state tinyint 與state_description 相關聯的 識別碼。

0 = INVISIBLE

1 = OPEN

2 = CLOSED

3 = COMPRESSED

4 = TOMBSTONE

COMPRESSED 是唯一適用于記憶體內部資料表的狀態。
state_desc nvarchar(60) 資料列群組狀態的描述:

0 - INVISIBLE -正在建置的資料列群組。 例如:
當資料正在壓縮時,資料行存放區中的資料列群組為 INVISIBLE。 當壓縮完成時,中繼資料參數會將資料行存放區資料列群組的狀態從 INVISIBLE 變更為 COMPRESSED,並將差異存放區資料列群組的狀態從 CLOSED 變更為 TOMBSTONE。

1 - OPEN - 接受新資料列的差異存放區資料列群組。 開啟的資料列群組仍處於資料列存放區格式,而且尚未壓縮為數據行存放區格式。

2 - CLOSED - 差異存放區中的資料列群組,其中包含最大資料列數目,並正在等候 Tuple Mover 進程將其壓縮到資料行存放區。

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:在索引建置作業期間,關閉為最後一個資料列群組的一部分,其中包含 < 1 百萬個數據列。 注意:具有多個核心的分割區組建可能會導致此類型的多個修剪。

7 - STATS_MISMATCH:僅適用于記憶體內部資料表上的資料行存放區。 如果統計資料不正確指出 > = 尾端的 1 百萬個限定資料列,但我們發現較少,壓縮的資料列群組將會有 < 100 萬個數據列

8 - SPILLOVER:僅適用于記憶體內部資料表上的資料行存放區。 如果 tail 有 > 1 百萬個限定資料列,則如果計數介於 100k 到 1 百萬之間,則會壓縮最後一批剩餘的資料列

9 - AUTO_MERGE:在背景中執行的 Tuple Mover 合併作業會將一或多個資料列群組合並到此資料列群組。
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 - 在背景中執行的 Tuple 移動器壓縮了資料列群組。 Tuple 移動器會在資料列群組將狀態從 OPEN 變更為 CLOSED 之後發生。

4 - REORG_NORMAL - 重組作業,ALTER INDEX ...REORG,將 CLOSED 資料列群組從差異存放區移至資料行存放區。 發生于 Tuple 移動器有時間移動資料列群組之前。

5 - REORG_FORCED - 此資料列群組已在差異存放區中開啟,並已強制進入資料行存放區,然後才有完整的資料列數目。

6 - BULKLOAD - 大量載入作業會直接壓縮資料列群組,而不使用差異存放區。

7 - MERGE - 合併作業會將一或多個資料列群組合並到此資料列群組,然後執行資料行存放區壓縮。
has_vertipaq_optimization bit VertiPaq 優化會重新排列資料列群組中的資料列順序,以達到較高的壓縮,藉以改善資料行存放區壓縮。 在大部分情況下,此優化會自動進行。 沒有使用 VertiPaq 優化的情況有兩種:
a. 當差異資料列群組移至資料行存放區,且資料行存放區索引上有一或多個非叢集索引時,會略過 VertiPaq 優化,以將對應索引的變更降到最低;
b. 針對記憶體優化資料表的資料行存放區索引。

0 = 否

1 = 是
生成 bigint 與此資料列群組相關聯的資料列群組產生。
created_time datetime2 建立此資料列群組的時鐘時間。

Null - 記憶體內部資料表的資料行存放區索引。
closed_time datetime2 關閉此資料列群組的時鐘時間。

Null - 記憶體內部資料表的資料行存放區索引。

結果

針對目前資料庫中的每個資料列群組,各傳回一個資料列。

權限

CONTROL需要資料表的許可權和 VIEW DATABASE STATE 資料庫的許可權。

SQL Server 2022 和更新版本的權限

需要資料庫上的 VIEW DATABASE PERFORMANCE STATE 權限。

範例

A. 計算片段,以決定何時重新組織或重建資料行存放區索引。

對於資料行存放區索引,已刪除的資料列百分比是資料列群組中片段的良好量值。 當片段是 20% 以上時,請移除已刪除的資料列。 如需更多範例,請參閱 重新組織及重建索引

此範例會將 sys.dm_db_column_store_row_group_physical_stats 與其他系統資料表聯結,然後將資料 Fragmentation 行計算為目前資料庫中每個資料列群組效率的估計值。 若要尋找單一資料表的資訊,請移除 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)