Udostępnij za pośrednictwem


sys.dm_db_column_store_row_group_physical_stats (Transact-SQL)

Applies to: SQL Server 2016 (13.x) and later Azure SQL DatabaseAzure SQL Managed Instance

Zawiera bieżące informacje na poziomie grupy wierszy dotyczące wszystkich indeksów magazynu kolumn w bieżącej bazie danych.

This DMV extends the catalog view sys.column_store_row_groups.

Column name Data type Description
object_id int Identyfikator tabeli bazowej.
index_id int Identyfikator tego indeksu magazynu kolumn w object_id tabeli.
partition_number int Identyfikator partycji tabeli, która zawiera row_group_idelement . Możesz użyć partition_number, aby dołączyć do tego dynamicznego widoku zarządzania sys.partitions
row_group_id int Identyfikator tej grupy wierszy. W przypadku tabel partycjonowanych wartość jest unikatowa w obrębie partycji.

-1 w przypadku ogona w pamięci.
delta_store_hobt_id bigint Hobt_id dla grupy wierszy w magazynie różnicowym.

NULL jeśli grupa wierszy nie znajduje się w magazynie różnicowym.

NULL dla części końcowej tabeli w pamięci.
state tinyint Identyfikator skojarzony z numerem state_description.

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

COMPRESSED jest jedynym stanem, który ma zastosowanie do tabel w pamięci.
state_desc nvarchar(60) Opis stanu grupy wierszy:

0 - INVISIBLE - Grupa wierszy, która jest tworzona. For example:

Grupa wierszy w magazynie kolumn jest INVISIBLE podczas kompresowania danych. Po zakończeniu kompresji przełączenie metadanych zmienia stan grupy wierszy magazynu kolumn z INVISIBLE na COMPRESSED, a stan grupy wierszy magazynu delty z CLOSED na TOMBSTONE.

1 - OPEN — Grupa wierszy magazynu różnicowego akceptująca nowe wiersze. Otwarta grupa wierszy jest nadal w formacie magazynu wierszy i nie została skompresowana do formatu magazynu kolumn.

2 - CLOSED - Grupa wierszy w magazynie różnicowym, która zawiera maksymalną liczbę wierszy i oczekuje na proces przerzucania krotki, aby skompresować go do magazynu kolumn.

3 - COMPRESSED — Grupa wierszy skompresowana z kompresją magazynu kolumn i przechowywana w magazynie kolumn.

4 - TOMBSTONE - Grupa wierszy, która była wcześniej w magazynie delty i nie jest już używana.
total_rows bigint Liczba wierszy przechowywanych fizycznie w grupie wierszy. W przypadku skompresowanych grup wierszy. Zawiera wiersze oznaczone jako usunięte.
deleted_rows bigint Liczba wierszy przechowywanych fizycznie w skompresowanej grupie wierszy, które są oznaczone do usunięcia.

0 dla grup wierszy, które znajdują się w magazynie różnicowym.

W przypadku indeksów nieklastrowanych magazynu kolumn ta wartość nie obejmuje usuniętych wierszy przechowywanych w buforze usuwania. For more information, and to find the number of deleted rows in the delete buffer, see sys.internal_partitions.
size_in_bytes bigint Łączny rozmiar w bajtach wszystkich stron w tej grupie wierszy. Ten rozmiar nie zawiera rozmiaru wymaganego do przechowywania metadanych ani udostępnionych słowników.
trim_reason tinyint Przyczyna, która wyzwoliła grupę COMPRESSED wierszy, aby mieć mniejszą niż maksymalną liczbę wierszy.

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) Opis elementu trim_reason.

0 - UNKNOWN_UPGRADED_FROM_PREVIOUS_VERSION: Wystąpił podczas uaktualniania z poprzedniej wersji programu SQL Server.

1 - NO_TRIM: Grupa wierszy nie została przycięta. Grupa wierszy została skompresowana z maksymalnie 1 048 576 wierszy. Liczba wierszy może być mniejsza, jeśli podzbiór wierszy został usunięty po zamknięciu grupy wierszy różnicowych

2 - BULKLOAD: Rozmiar partii ładowania zbiorczego ogranicza liczbę wierszy.

3 - REORG: Wymuszona kompresja REORG w ramach polecenia.

4 - DICTIONARY_SIZE: Rozmiar słownika wzrósł zbyt duży, aby skompresować wszystkie wiersze razem.

5 - MEMORY_LIMITATION: Za mało dostępnej pamięci, aby skompresować wszystkie wiersze razem.

6 - RESIDUAL_ROW_GROUP: Zamknięty w ramach ostatniej grupy wierszy z wierszami < 1 milion podczas operacji kompilacji indeksu.

Note: A partition build with multiple cores can result in more than one trim of this type.

7 - STATS_MISMATCH: tylko w przypadku magazynu kolumn w tabeli w pamięci. Jeśli statystyki niepoprawnie wskazują >= 1 milion kwalifikowanych wierszy w ogonie, ale znaleźliśmy mniej, skompresowana grupa wierszy będzie miała < 1 milion wierszy

8 - SPILLOVER: tylko w przypadku magazynu kolumn w tabeli w pamięci. Jeśli ogon ma > 1 milion kwalifikowanych wierszy, ostatnia partia pozostałych wierszy jest kompresowana, jeśli liczba wynosi od 100 000 do 1 miliona

9 - AUTO_MERGE: Operacja scalania krotki Mover uruchomiona w tle skonsolidowana co najmniej jedna grupa wierszy w tej grupie wierszy.
transition_to_compressed_state tinyint Pokazuje, jak ta grupa wierszy została przeniesiona z magazynu delty do stanu skompresowanego w magazynie kolumn.

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 — operacja nie ma zastosowania do magazynu delty. Lub grupa wierszy została skompresowana przed uaktualnieniem do programu SQL Server 2016 (13.x), w którym to przypadku historia nie jest zachowywana.

2 - INDEX_BUILD — Indeks tworzy lub kompiluje ponownie skompresowaną grupę wierszy.

3 - TUPLE_MOVER - Krotka mover uruchomiona w tle skompresowała grupę wierszy. Krotka jest wykonywana po zmianie stanu grupy wierszy z OPEN na CLOSED.

4 - REORG_NORMAL — Operacja reorganizacji , ALTER INDEX ... REORGprzeniosła grupę CLOSED wierszy z magazynu delty do magazynu kolumn. Miało to miejsce, zanim krotka-mover miała czas na przeniesienie grupy wierszy.

5 - REORG_FORCED — Ta grupa wierszy była otwarta w magazynie delty i została wymusina w magazynie kolumn, zanim zawierała pełną liczbę wierszy.

6 - BULKLOAD - Operacja ładowania zbiorczego skompresowała grupę wierszy bezpośrednio bez użycia magazynu różnicowego.

7 - MERGE — Operacja scalania skonsolidował co najmniej jedną grupę wierszy w tej grupie wierszy, a następnie wykonał kompresję magazynu kolumn.
has_vertipaq_optimization bit Optymalizacja VertiPaq poprawia kompresję magazynu kolumn przez zmiana kolejności wierszy w grupie wierszy w celu osiągnięcia wyższej kompresji. Ta optymalizacja jest wykonywana automatycznie w większości przypadków. Istnieją dwa przypadki, w których optymalizacja VertiPaq nie jest używana:

a. gdy grupa wierszy różnicowych przechodzi do magazynu kolumn i istnieje co najmniej jeden indeks nieklastrowany w indeksie magazynu kolumn — w tym przypadku optymalizacja VertiPaq jest pomijana w celu zminimalizowania zmian indeksu mapowania;

b. dla indeksów magazynu kolumn w tabelach zoptymalizowanych pod kątem pamięci.

0 = Nie
1 = Tak
generation bigint Generowanie grup wierszy skojarzone z tą grupą wierszy.
created_time datetime2 Godzina zegara dla momentu utworzenia tej grupy wierszy.

NULL — dla indeksu magazynu kolumn w tabeli w pamięci.
closed_time datetime2 Godzina zegara dla momentu zamknięcia tej grupy wierszy.

NULL — dla indeksu magazynu kolumn w tabeli w pamięci.

Results

Zwraca jeden wiersz dla każdej grupy wierszy w bieżącej bazie danych.

Permissions

Wymaga CONTROL uprawnienia do tabeli i uprawnienia VIEW DATABASE STATE w bazie danych.

Uprawnienia dla programu SQL Server 2022 i nowszych

Wymaga uprawnienia VIEW DATABASE PERFORMANCE STATE do bazy danych.

Examples

A. Oblicz fragmentację, aby zdecydować, kiedy zreorganizować lub ponownie skompilować indeks magazynu kolumn

W przypadku indeksów magazynu kolumn procent usuniętych wierszy jest dobrą miarą fragmentacji w grupie wierszy. Gdy fragmentacja wynosi 20% lub więcej, usuń usunięte wiersze. Aby uzyskać więcej przykładów, zobacz Optymalizowanie konserwacji indeksu w celu zwiększenia wydajności zapytań i zmniejszenia zużycia zasobów.

Ten przykład łączy się sys.dm_db_column_store_row_group_physical_stats z innymi tabelami systemowymi, a następnie oblicza Fragmentation kolumnę jako oszacowanie wydajności każdej grupy wierszy w bieżącej bazie danych. Aby znaleźć informacje dotyczące pojedynczej tabeli, usuń łączniki komentarzy przed WHERE klauzulą i podaj nazwę tabeli.

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;