Sdílet prostřednictvím


sys.dm_db_column_store_row_group_physical_stats (Transact-SQL)

Platí na: SQL Server 2016 (13.x) a novější verze Azure SQL DatabaseAzure SQL Managed InstanceSQL database in Microsoft Fabric

Poskytuje aktuální informace na úrovni skupiny řádků o všech indexech columnstore v aktuální databázi.

Toto zobrazení dynamické správy rozšiřuje zobrazení katalogu sys.column_store_row_groups.

Název sloupce Datový typ Description
object_id int ID podkladové tabulky.
index_id int ID tohoto indexu columnstore v object_id tabulce.
partition_number int ID oddílu tabulky, který obsahuje row_group_id. K připojení k tomuto zobrazení dynamické správy můžete použít partition_number sys.partitions
row_group_id int ID této skupiny řádků. U dělených tabulek je hodnota v rámci oddílu jedinečná.

-1 pro chvost v paměti.
delta_store_hobt_id bigint Hobt_id pro skupinu řádků v rozdílovém úložišti.

NULL pokud skupina řádků není v rozdílovém úložišti.

NULL pro chvost tabulky v paměti.
state tinyint Číslo ID přidružené state_description.

0 = INVISIBLE
1= OPEN
2 = CLOSED
3 = COMPRESSED
4 = TOMBSTONE

COMPRESSED je jediný stav, který platí pro tabulky v paměti.
state_desc nvarchar(60) Popis stavu skupiny řádků:

0 - INVISIBLE - Skupina řádků, která se sestavuje. Například:

Skupina řádků ve columnstore je INVISIBLE v době, kdy se data komprimují. Po dokončení komprese změní přepínač metadat stav skupiny řádků columnstore z INVISIBLE do COMPRESSEDa stav skupiny řádků deltastore z CLOSED do TOMBSTONE.

1 - OPEN – Skupina řádků deltastore, která přijímá nové řádky. Otevřená skupina řádků je stále ve formátu rowstore a nebyla komprimována do formátu columnstore.

2 - CLOSED – Skupina řádků v rozdílovém úložišti, která obsahuje maximální počet řádků a čeká na proces přesunu řazené kolekce členů, aby ho zkomprimuje do columnstore.

3 - COMPRESSED – Skupina řádků komprimovaná pomocí komprese columnstore a uložená v úložišti columnstore.

4 - TOMBSTONE – Skupina řádků, která byla dříve v deltastore a už se nepoužívá.
total_rows bigint Počet řádků fyzicky uložených ve skupině řádků Pro komprimované skupiny řádků. Obsahuje řádky označené jako odstraněné.
deleted_rows bigint Počet řádků fyzicky uložených ve komprimované skupině řádků, které jsou označené k odstranění.

0 pro skupiny řádků, které jsou v rozdílovém úložišti.

U neclusterovaných indexů columnstore tato hodnota nezahrnuje odstraněné řádky uložené ve vyrovnávací paměti pro odstranění. Další informace a zjištění počtu odstraněných řádků v vyrovnávací paměti pro odstranění najdete v tématu sys.internal_partitions.
size_in_bytes bigint Kombinovaná velikost všech stránek v této skupině řádků v bajtech Tato velikost nezahrnuje velikost potřebnou k ukládání metadat nebo sdílených slovníků.
trim_reason tinyint Důvod, proč se skupina řádků aktivovala COMPRESSED tak, aby měla menší než maximální počet řádků.

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) Popis .trim_reason

0 - UNKNOWN_UPGRADED_FROM_PREVIOUS_VERSION: Při upgradu z předchozí verze SQL Serveru došlo.

1 - NO_TRIM: Skupina řádků nebyla oříznuta. Skupina řádků byla komprimována s maximálním počtem 1 048 576 řádků. Počet řádků může být menší, pokud se po zavření rozdílové skupiny řádků odstranila podmnožina řádků.

2 - BULKLOAD: Velikost dávky hromadného načtení omezila počet řádků.

3 - REORG: Vynucená komprese jako součást REORG příkazu.

4 - DICTIONARY_SIZE: Velikost slovníku se zvětšila příliš velká, aby se komprimovala všechny řádky dohromady.

5 - MEMORY_LIMITATION: Nedostatek dostupné paměti pro komprimaci všech řádků dohromady.

6 - RESIDUAL_ROW_GROUP: Uzavřeno jako součást poslední skupiny řádků s řádky < 1 milion během operace sestavení indexu.

Poznámka: Sestavení oddílu s více jádry může vést k více než jednomu oříznutí tohoto typu.

7 - STATS_MISMATCH: Pouze pro columnstore v tabulce v paměti. Pokud statistiky nesprávně označí >= 1 milion kvalifikovaných řádků v chvostu, ale zjistili jsme méně, bude mít komprimovaná skupina řádků < 1 milion řádků.

8 - SPILLOVER: Pouze pro columnstore v tabulce v paměti. Pokud má > chvost 1 milion kvalifikovaných řádků, zkomprimují se poslední zbývající řádky dávky, pokud je počet mezi 100 000 a 1 miliony.

9 - AUTO_MERGE: Operace sloučení s řazenou kolekcí členů spuštěná na pozadí sloučila jednu nebo více skupin řádků do této skupiny řádků.
transition_to_compressed_state tinyint Ukazuje, jak se tato skupina řádků přesunula z deltastore do komprimovaného stavu ve columnstore.

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 – operace se nevztahuje na deltastore. Nebo se před upgradem na SQL Server 2016 (13.x) zkomprimovala skupina řádků. V takovém případě se historie nezachová.

2 - INDEX_BUILD – Opětovné vytvoření indexu nebo opětovné sestavení indexu zkomprimuje skupinu řádků.

3 - TUPLE_MOVER – Přesun řazené kolekce členů spuštěné na pozadí komprimoval skupinu řádků. Přesunutí řazené kolekce členů probíhá po změně stavu skupiny řádků z OPEN do CLOSED.

4 - REORG_NORMAL - Operace změny uspořádání, ALTER INDEX ... REORGpřesune CLOSED skupinu řádků z deltastore do columnstore. K tomu došlo před přesunutím řazené kolekce členů čas přesunout skupinu řádků.

5 - REORG_FORCED – Tato skupina řádků byla otevřena v deltastore a byla vynucena do columnstore předtím, než měla celý počet řádků.

6 - BULKLOAD – Operace hromadného načtení komprimovala skupinu řádků přímo bez použití deltastore.

7 - MERGE – Slučovací operace konsolidovala jednu nebo více skupin řádků do této skupiny řádků a poté provedla kompresi columnstore.
has_vertipaq_optimization bit Optimalizace VertiPaq zlepšuje kompresi columnstore tím, že přeuspořádá pořadí řádků ve skupině řádků, aby se dosáhlo vyšší komprese. K této optimalizaci dochází ve většině případů automaticky. Existují dva případy, kdy se nepoužívá optimalizace VertiPaq:

a. když se rozdílová skupina řádků přesune do columnstore a v indexu columnstore existuje jeden nebo více neclusterovaných indexů – v tomto případě se optimalizace VertiPaq přeskočí, aby se minimalizovaly změny indexu mapování;

b. pro indexy columnstore v tabulkách optimalizovaných pro paměť.

0 = Ne
1 = Ano
generation bigint Generování skupiny řádků přidružené k této skupině řádků
created_time datetime2 Hodinový čas pro vytvoření této skupiny řádků

NULL – pro index columnstore v tabulce v paměti.
closed_time datetime2 Doba, kdy byla tato skupina řádků uzavřena.

NULL – pro index columnstore v tabulce v paměti.

Results

Vrátí jeden řádek pro každou skupinu řádků v aktuální databázi.

Permissions

Vyžaduje oprávnění CONTROL pro tabulku a VIEW DATABASE STATE oprávnění k databázi.

Oprávnění pro SQL Server 2022 a novější

Vyžaduje VIEW DATABASE PERFORMANCE STATE oprávnění k databázi.

Examples

A. Výpočet fragmentace a rozhodnutí o opětovném uspořádání nebo opětovném sestavení indexu columnstore

U indexů columnstore je procento odstraněných řádků dobrou mírou fragmentace v rámci skupiny řádků. Pokud je fragmentace 20% nebo více, odeberte odstraněné řádky. Další příklady najdete v tématu Optimalizace údržby indexů za účelem zlepšení výkonu dotazů a snížení spotřeby prostředků.

Tento příklad spojí sys.dm_db_column_store_row_group_physical_stats s jinými systémovými tabulkami a potom vypočítá Fragmentation sloupec jako odhad efektivity každé skupiny řádků v aktuální databázi. Pokud chcete najít informace o jedné tabulce, odeberte před klauzulí pomlčky WHERE komentářů a zadejte název tabulky.

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
     INNER 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;