sys.dm_db_column_store_row_group_physical_stats (Transact-SQL)
適用於:SQL Server 2016 (13.x) 和更新版本 Azure SQL 資料庫 Azure 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)