sys.dm_db_index_operational_stats (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w Microsoft Fabric

Zwraca statystyki dostępu do danych niższego poziomu, blokowania i zatrzasania dla każdej partycji tabeli lub indeksu w bazie danych.

Transact-SQL konwencje składni

Składnia

sys.dm_db_index_operational_stats (
    { database_id | NULL | 0 | DEFAULT }
    , { object_id | NULL | 0 | DEFAULT }
    , { index_id | 0 | NULL | -1 | DEFAULT }
    , { partition_number | NULL | 0 | DEFAULT }
)

Arguments

{ database_id | NULL | 0 | DEFAULT }

Identyfikator bazy danych. database_id jest smallint. Poprawne dane wejściowe to numer ID bazy danych, NULL, 0, lub DEFAULT. Wartość domyślna to 0. NULL, 0i DEFAULT są równoważnymi wartościami w tym kontekście.

Określ NULL, aby zwrócić informacje dla wszystkich baz danych w wystąpieniu programu SQL Server. Jeśli określisz NULL dla database_id, należy również określić NULL dla object_id, index_idi partition_number.

Można określić wbudowaną funkcję DB_ID.

{ object_id | NULL | 0 | DEFAULT }

Identyfikator obiektu tabeli lub widoku indeks jest włączony. object_id jest int.

Poprawne dane wejściowe to numer ID tabeli i widok, NULL, 0, lub DEFAULT. Wartość domyślna to 0. NULL, 0i DEFAULT są równoważnymi wartościami w tym kontekście.

Określ NULL, aby zwrócić informacje dla wszystkich tabel i widoków w określonej bazie danych. Jeśli określisz NULL dla object_id, należy również określić NULL dla index_id i partition_number.

{ index_id | 0 | NULL | -1 | DEFAULT }

Identyfikator indeksu. index_id to inteligencja. Poprawne wejścia to numer ID indeksu, 0 jeśli object_id jest kopcem, NULL, -1, lub DEFAULT. Wartość domyślna to -1. NULL, -1i DEFAULT są równoważnymi wartościami w tym kontekście.

Określ NULL, aby zwrócić informacje dla wszystkich indeksów dla tabeli podstawowej lub widoku. Jeśli określisz NULL dla index_id, należy również określić NULL dla partition_number.

{ partition_number | NULL | 0 | DEFAULT }

Numer partycji w obiekcie. partition_number jest int. Prawidłowe dane wejściowe to partition_number indeksu lub sterta, NULL, 0lub DEFAULT. Wartość domyślna to 0. NULL, 0i DEFAULT są równoważnymi wartościami w tym kontekście.

Określ NULL tak, aby zwracała informacje dla wszystkich partycji indeksu lub kopca.

partition_number jest oparty na 1. Indeks niepartycyjny lub sterta ma partition_number ustawioną na 1.

Zwrócona tabela

Nazwa kolumny Typ danych Opis
database_id smallint Identyfikator bazy danych.

W usłudze Azure SQL Database wartości są unikatowe w ramach pojedynczej bazy danych lub elastycznej puli, ale nie w obrębie serwera logicznego.
object_id int Identyfikator tabeli lub widoku. Więcej informacji można znaleźć w sys.objects.
index_id int Identyfikator indeksu lub sterta. Więcej informacji można znaleźć na sys.indexes.
partition_number int 1 numer partycji w indeksie lub stercie. Więcej informacji można znaleźć w sys.partitions.
hobt_id bigint Identyfikator sterta danych lub zestawu wierszy drzewa B, który śledzi dane wewnętrzne dla indeksu magazynu kolumn.

NULL - To nie jest wewnętrzny zestaw wierszy w columnstore.

Aby uzyskać więcej informacji, zobacz sys.internal_partitions.
leaf_insert_count bigint Skumulowana liczba wstawień na poziomie liścia. Aby uzyskać więcej informacji na temat poziomów indeksów, zobacz Architektura indeksu i przewodnik projektowania.
leaf_delete_count bigint Skumulowana liczba usuniętych poziomów liścia. leaf_delete_count jest zwiększana tylko dla usuniętych rekordów, które nie są oznaczone jako duch jako pierwsze. W przypadku usuniętych rekordów, które są najpierw upiorne, leaf_ghost_count jest zwiększane.
leaf_update_count bigint Skumulowana liczba aktualizacji na poziomie liścia.
leaf_ghost_count bigint Skumulowana liczba wierszy na poziomie liścia, które są oznaczone jako usunięte, ale nie zostały jeszcze usunięte. To liczenie nie obejmuje rekordów natychmiast usuwanych bez oznaczenia jako duch. Wątek oczyszczania usuwa wiersze duchów w ustalonych odstępach czasu. Ta wartość nie obejmuje wierszy duchów, które są zachowywane z powodu nieopłaconej transakcji snapshot.
nonleaf_insert_count bigint Skumulowana liczba wstawek powyżej poziomu liścia. Dotyczy tylko indeksów drzewa B. 0 dla indeksów heaps lub columnstore.
nonleaf_delete_count bigint Skumulowana liczba usuwań powyżej poziomu liścia. Dotyczy tylko indeksów drzewa B. 0 dla indeksów heaps lub columnstore.
nonleaf_update_count bigint Skumulowana liczba aktualizacji powyżej poziomu liścia. Dotyczy tylko indeksów drzewa B. 0 dla indeksów heaps lub columnstore.
leaf_allocation_count bigint Skumulowana liczba alokacji stron na poziomie liścia w indeksie lub stercie.

W przypadku indeksu alokacja strony odpowiada podziałowi strony.
nonleaf_allocation_count bigint Skumulowana liczba alokacji stron spowodowanych podziałami stron powyżej poziomu liścia. Dotyczy tylko indeksów drzewa B. 0 dla indeksów heaps lub columnstore.
leaf_page_merge_count bigint Skumulowana liczba scalanych stron na poziomie liścia. Zawsze 0 dla indeksów magazynu kolumn.
nonleaf_page_merge_count bigint Skumulowana liczba stron scala się powyżej poziomu liścia. Dotyczy tylko indeksów drzewa B. 0 dla indeksów heaps lub columnstore.
range_scan_count bigint Skumulowana liczba skanowań zakresów i tabel rozpoczętych na indeksie lub stercie.
singleton_lookup_count bigint Skumulowana liczba pobierania pojedynczych wierszy z indeksu lub sterta.
forwarded_fetch_count bigint Liczba wierszy pobranych za pośrednictwem rekordu przekazującego. Dotyczy tylko szesnastek, 0 dla indeksów drzewa B.
lob_fetch_in_pages bigint Skumulowana liczba stron dużych obiektów (LOB) pobranych z LOB_DATA jednostki alokacji. Strony te zawierają dane zapisane w kolumnach typu tekst, ntext, image, varchar(max),nvarchar(max),varbinary(max),xml oraz json. Aby uzyskać więcej informacji, zobacz Typy danych.
lob_fetch_in_bytes bigint Skumulowana liczba pobranych bajtów danych BIZNESOWYCH.
lob_orphan_create_count bigint Skumulowana liczba oddzielonych wartości LOB utworzonych dla operacji zbiorczych. Dotyczy tylko indeksów klastrowanych heaps i B-tree, 0 dla indeksów nieklastrowanych i indeksów magazynu kolumn.
lob_orphan_insert_count bigint Skumulowana liczba oddzielonych wartości LOB wstawionych podczas operacji zbiorczych. Dotyczy tylko indeksów klastrowanych heaps i B-tree, 0 dla indeksów nieklastrowanych i indeksów magazynu kolumn.
row_overflow_fetch_in_pages bigint Skumulowana liczba stron danych przepełnienia wiersza pobranych z ROW_OVERFLOW_DATA jednostki alokacji.

Te strony zawierają dane przechowywane w kolumnach typu varchar(n), nvarchar(n), varbinary(n)i sql_variant dla dużych wierszy.
row_overflow_fetch_in_bytes bigint Skumulowana liczba pobranych bajtów danych przepełnienia wiersza.
column_value_push_off_row_count bigint Skumulowana liczba wartości kolumn dla danych BIZNESOWYCH i danych przepełnienia wierszy, które są wypychane poza wierszem, aby wstawić lub zaktualizować wiersz pasujący do strony.
column_value_pull_in_row_count bigint Skumulowana liczba wartości kolumn dla danych BIZNESOWYCH i danych przepełnienia wierszy, które są pobierane w wierszu. Dzieje się tak, gdy operacja aktualizacji zwalnia miejsce w rekordzie i umożliwia ściąganie co najmniej jednej wartości poza wierszem z LOB_DATA jednostki alokacji lub ROW_OVERFLOW_DATA do IN_ROW_DATA jednostki alokacji.
row_lock_count bigint Żądana skumulowana liczba żądań blokad wierszy.
row_lock_wait_count bigint Skumulowana liczba przypadków oczekiwania aparatu bazy danych na blokadę wiersza.
row_lock_wait_in_ms bigint Łączna liczba milisekund oczekiwania aparatu bazy danych na blokadę wiersza.
page_lock_count bigint Żądana skumulowana liczba żądań blokad stron.
page_lock_wait_count bigint Skumulowana liczba przypadków oczekiwania aparatu bazy danych na blokadę strony.
page_lock_wait_in_ms bigint Łączna liczba milisekund oczekiwania aparatu bazy danych na blokadę strony.
index_lock_promotion_attempt_count bigint Skumulowana liczba prób eskalacji blokad przez aparat bazy danych.
index_lock_promotion_count bigint Skumulowana liczba przypadków eskalacji blokad przez aparat bazy danych.
page_latch_wait_count bigint Skumulowana liczba przypadków oczekiwania aparatu bazy danych na uzyskanie zatrzaśnięć.
page_latch_wait_in_ms bigint Skumulowana liczba milisekund, w których aparat bazy danych czekał na uzyskanie zatrzasku.
page_io_latch_wait_count bigint Skumulowana liczba przypadków oczekiwania aparatu bazy danych na zatrzaśniętym we/wy strony.
page_io_latch_wait_in_ms bigint Skumulowana liczba milisekund oczekiwania aparatu bazy danych na zatrzask we/wy strony.
tree_page_latch_wait_count bigint Podzbiór zawiera page_latch_wait_count tylko strony drzewa B najwyższego poziomu. Zawsze 0 dla stosu lub indeksu magazynu kolumn.
tree_page_latch_wait_in_ms bigint Podzbiór zawiera page_latch_wait_in_ms tylko strony drzewa B najwyższego poziomu. Zawsze 0 dla stosu lub indeksu magazynu kolumn.
tree_page_io_latch_wait_count bigint Podzbiór zawiera page_io_latch_wait_count tylko strony drzewa B najwyższego poziomu. Zawsze 0 dla stosu lub indeksu magazynu kolumn.
tree_page_io_latch_wait_in_ms bigint Podzbiór zawiera page_io_latch_wait_in_ms tylko strony drzewa B najwyższego poziomu. Zawsze 0 dla stosu lub indeksu magazynu kolumn.
page_compression_attempt_count bigint Liczba stron, które zostały ocenione pod kątem PAGE kompresji poziomu dla konkretnej partycji tabeli, indeksu lub widoku indeksowego. Zawiera strony, które nie zostały skompresowane, ponieważ nie udało się osiągnąć znaczących oszczędności. Zawsze 0 dla indeksów magazynu kolumn.
page_compression_success_count bigint Liczba stron danych skompresowanych przez kompresję PAGE dla określonych partycji tabeli, indeksu lub widoku indeksowego. Zawsze 0 dla indeksów magazynu kolumn.
version_generated_inrow bigint Skumulowana liczba wersji w wierszu z ładunkiem wygenerowanym w stercie lub drzewie B dla operacji aktualizacji, scalania lub wstawiania nad ghostem. Wersja w wierszu przechowuje stary obraz wiersza (lub różnicę) bezpośrednio w wierszu, unikając podróży do magazynu wersji. Ta liczba jest nadzbiorem zawierającym wersje zliczane przez insert_over_ghost_version_inrow. Aby uzyskać więcej informacji na temat wersji w wierszach i poza wierszami, zobacz Spacja używana przez magazyn wersji trwałych (PVS).
version_generated_offrow bigint Skumulowana liczba wersji wypychanych do magazynu poza wierszem dla sterty, drzewa B-tree lub usuwania LOB, aktualizacji, scalania lub operacji insert-over-ghost. Wersja poza wierszem jest generowana, gdy stary obraz wiersza nie może być przechowywany w rzędzie. Ta liczba jest nadzbiorem zawierającym wersje zliczane przez ghost_version_offrow i insert_over_ghost_version_offrow.
ghost_version_inrow bigint Skumulowana liczba przypadków usunięcia lub aktualizacji (wykonywanej jako usunięcie, po której następuje wstawianie) oznaczono istniejący wiersz jako duch z informacjami o wersji w wierszu. Wersja w wierszu przechowuje tylko znacznik czasu transakcji i ładunek o zerowej długości, dzięki czemu cofnięcie usunięcia wymaga tylko unghosting wiersza.
ghost_version_offrow bigint Skumulowana liczba przypadków usunięcia lub aktualizacji (wykonywanej jako usunięcie, po której następuje wstawianie) wypchnęła istniejące dane wiersza lub kolumny LOB do magazynu poza wierszem, pozostawiając wycinkę w wierszu na potrzeby informacji o wersji. Ten licznik jest zwiększany wraz z operacjami version_generated_offrow duchów.
insert_over_ghost_version_inrow bigint Skumulowana liczba wersji w wierszu z ładunkiem wygenerowanym dla operacji wstawiania drzewa B.over-ghost. Wstaw over-ghost występuje, gdy nowy wiersz zostanie wstawiony do miejsca wcześniej upiornego rekordu, albo z jawnego usunięcia, a następnie wstawiania, albo z aktualizacji lub scalania zaimplementowanego jako usunięcie, po którym następuje wstawianie. Ten licznik jest podzbiorem .version_generated_inrow
insert_over_ghost_version_offrow bigint Skumulowana liczba razy, gdy istniejący wiersz duchów został wypchnięty do magazynu poza wierszem podczas operacji wstawiania drzewa B,over-ghost, pozostawiając wycinkę w nowo wstawionym wierszu na potrzeby informacji o wersji. Ten licznik jest podzbiorem .version_generated_offrow
compaction_attempt_count bigint Skumulowana liczba prób auto-zagęszczania indeksu. Więcej informacji można znaleźć w artykule Automatyczna kompresja indeksu (podgląd).
compaction_complete_count bigint Skumulowana liczba ukończonych automatycznych kompakcji indeksowych.
compaction_skip_count bigint Skumulowana liczba automatycznych kompakcji pomijanych indeksów. Więcej informacji o przyczynach pomijania można znaleźć w artykule Użyj rozszerzonego zdarzenia do monitorowania statystyk zagęszczania.
compaction_ineligible_count bigint Łączna liczba prób zagęszczania została pominięta, ponieważ strona nie kwalifikowała się do automatycznego zagęszczania.
compaction_failure_count bigint Łączna liczba nieudanych prób zagęszczenia.
compaction_row_move_count bigint Łączna liczba wierszy przeniesionych z jednej strony na drugą w ramach automatycznej kompresji.
compaction_page_deallocation_count bigint Łączna liczba stron, które zostały zdelokowane po przeniesieniu wszystkich wierszy na inną stronę.

Note

W dokumentacji jest zwykle używany termin B-tree w odniesieniu do indeksów. W indeksach typu rowstore silnik bazy danych implementuje drzewo B+. Nie dotyczy to indeksów magazynu kolumn ani indeksów w tabelach zoptymalizowanych pod kątem pamięci. Aby uzyskać więcej informacji, zobacz architekturę i przewodnik projektowania indeksu SQL Server i Azure SQL.

Uwagi

Ta funkcja nie zwraca informacji o indeksach w tabelach zoptymalizowanych pod kątem pamięci. Aby uzyskać informacje o indeksach w tablicach zoptymalizowanych pod pamięć, zobacz sys.dm_db_xtp_index_stats.

Ta funkcja nie akceptuje skorelowanych parametrów z CROSS APPLY i OUTER APPLY.

sys.dm_db_index_operational_stats Służy do śledzenia statystyk operacji odczytu i zapisu danych oraz blokowania, zatrzaśnięcia strony oraz statystyk zatrzaśnięcia we/wy strony dla tabeli, indeksu lub partycji. Możesz zidentyfikować tabele, indeksy i partycje, które napotykają znaczną aktywność lub rywalizację.

Statystyki są udostępniane na poziomie partycji i są addytywne. Oznacza to, że można uzyskać statystyki na poziomie indeksu lub na poziomie tabeli, pisząc zapytanie agregacji w języku T-SQL. Aby uzyskać więcej informacji, zobacz Skanowanie indeksów i szuka wszystkich przykładów tabel .

Aby analizować statystyki operacji odczytu i zapisu dla tabeli, indeksu lub partycji, użyj następujących kolumn:

  • leaf_insert_count
  • leaf_delete_count
  • leaf_update_count
  • leaf_ghost_count
  • range_scan_count
  • singleton_lookup_count

Aby zidentyfikować rywalizację o zatrzask, użyj następujących kolumn:

  • page_latch_wait_count
  • page_latch_wait_in_ms

Aby zidentyfikować rywalizację o blokadę, użyj następujących kolumn:

  • row_lock_count
  • page_lock_count
  • row_lock_wait_in_ms
  • page_lock_wait_in_ms

Aby przeanalizować fizyczne statystyki we/wy, użyj następujących kolumn:

  • page_io_latch_wait_count
  • page_io_latch_wait_in_ms

Uwagi w kolumnie

Wartości w kolumnach lob_fetch_in_pages i lob_fetch_in_bytes mogą być większe niż zero dla indeksów nieklastrowanych, które zawierają co najmniej jedną kolumnę LOB jako dołączone kolumny. Aby uzyskać więcej informacji, zobacz Tworzenie indeksów z dołączonymi kolumnami. Podobnie wartości w kolumnach row_overflow_fetch_in_pages i row_overflow_fetch_in_bytes mogą być większe niż 0 dla indeksów nieklastrowanych, jeśli indeks zawiera duże wiersze.

Jak są resetowane liczniki w pamięci podręcznej metadanych

Dane zwrócone przez sys.dm_db_index_operational_stats program istnieją tylko tak długo, jak obiekt pamięci podręcznej metadanych reprezentujący stertę lub drzewo B jest dostępne. Te dane nie są trwałe. Oznacza to, że nie możesz użyć tych liczników do jednoznacznego określenia, czy indeks został użyty, ani kiedy ostatnio był używany. Zamiast tego użyj sys.dm_db_index_usage_stats.

Wartości każdej kolumny liczbowej są ustawiane na zero, gdy metadane sterta lub drzewo B są wprowadzane do pamięci podręcznej metadanych. Statystyki są gromadzone do momentu usunięcia obiektu pamięci podręcznej z pamięci podręcznej metadanych. Aktywna sterta lub drzewo B często zawiera metadane w pamięci podręcznej, a skumulowane liczby odzwierciedlają działanie od czasu ostatniego uruchomienia wystąpienia aparatu bazy danych. Metadane mniej aktywnego stertu lub drzewa B mogą przenosić się do i z pamięci podręcznej w miarę ich użytkowania, szczególnie jeśli instancja Database Engine jest pod presją pamięci. W związku z tym statystyki operacyjne indeksu mogą czasami nie zostać odzwierciedlone w pliku sys.dm_db_index_operational_stats. To nie jest typowe.

Statystyki są usuwane z pamięci podręcznej i nie są już raportowane przez tę funkcję, jeśli tabela lub indeks zostanie porzucony lub jeśli partycja zostanie obcięta. Inne operacje DDL względem indeksu mogą spowodować zresetowanie wartości statystyk do zera.

Określanie wartości parametrów przy użyciu funkcji systemowych

Funkcji Transact-SQL można użyć DB_ID i OBJECT_ID, aby określić wartość parametrów database_id i object_id. Jednak przekazywanie wartości, które nie są poprawne, do tych funkcji może powodować niezamierzone skutki. Zawsze upewnij się, że podczas używania DB_ID lub OBJECT_IDjest zwracany prawidłowy identyfikator. Aby uzyskać więcej informacji, zobacz Zwracanie informacji dla określonej tabeli.

Permissions

Wymaga następujących uprawnień:

  • CONTROL uprawnienia do określonego obiektu w bazie danych

  • VIEW DATABASE STATE lub VIEW DATABASE PERFORMANCE STATE uprawnienia do zwracania informacji o wszystkich obiektach w określonej bazie danych, gdy wartość dla @object_id nie jest określona.

  • VIEW SERVER STATE lub VIEW SERVER PERFORMANCE STATE pozwolenie na zwracanie informacji o wszystkich bazach danych, gdy wartość nie @database_id jest określona.

Udzielenie VIEW DATABASE STATE lub VIEW SERVER PERFORMANCE STATE zezwolenie na zwracanie wszystkich obiektów w bazie danych, niezależnie od wszelkich CONTROL uprawnień odrzuconych dla określonych obiektów.

Odmawianie lub VIEW DATABASE STATE nie zezwala na zwracanie VIEW SERVER PERFORMANCE STATE wszystkich obiektów w bazie danych, niezależnie od uprawnień CONTROL przyznanych dla określonych obiektów.

Więcej informacji można znaleźć w artykule Widoki i funkcje zarządzania dynamicznego systemem.

Examples

Zwracanie informacji dla określonej tabeli

Poniższy przykład zwraca informacje o wszystkich indeksach i partycjach Person.Address tabeli w bazie AdventureWorks2025.

Ważna

Gdy używasz funkcji DB_ID Transact-SQL i OBJECT_ID zwracasz wartość parametru, zawsze upewnij się, że zwraca się poprawny identyfikator. Jeśli nie można odnaleźć nazwy bazy danych lub obiektu, na przykład gdy nie istnieją lub są niepoprawnie napisane, obie funkcje zwracają wartość NULL. Funkcja sys.dm_db_index_operational_stats interpretuje NULL jako wartość wieloznaczny określającą wszystkie bazy danych lub wszystkie obiekty. Ponieważ może to być operacja niezamierzona, przykłady w tej sekcji przedstawiają bezpieczny sposób określania identyfikatorów baz danych i obiektów.

DECLARE @db_id AS INT = DB_ID(N'AdventureWorks2025');
DECLARE @object_id AS INT = OBJECT_ID(N'AdventureWorks2025.Person.Address');

SELECT *
FROM sys.dm_db_index_operational_stats(@db_id, @object_id, NULL, NULL)
WHERE @db_id IS NOT NULL
      AND @object_id IS NOT NULL;

Zwracanie informacji dla wszystkich tabel i indeksów

Poniższy przykład zwraca informacje dotyczące wszystkich tabel i indeksów w wystąpieniu aparatu bazy danych.

SELECT *
FROM sys.dm_db_index_operational_stats(NULL, NULL, NULL, NULL);

Skanowanie indeksów i wyszukiwanie wszystkich tabel

Poniższy przykład agreguje dane na poziomie partycji w celu zwrócenia statystyk wyszukiwania indeksu i skanowania dla wszystkich tabel w bieżącej bazie danych.

SELECT OBJECT_SCHEMA_NAME(object_id) AS schema_name,
       OBJECT_NAME(object_id) AS object_name,
       COUNT(DISTINCT(index_id)) AS index_count,
       COUNT(DISTINCT(partition_number)) AS partition_count,
       SUM(range_scan_count) AS index_scan_count,
       SUM(singleton_lookup_count) AS index_seek_count
FROM sys.dm_db_index_operational_stats(DB_ID(), DEFAULT, DEFAULT, DEFAULT)
GROUP BY OBJECT_SCHEMA_NAME(object_id),
         OBJECT_NAME(object_id)
ORDER BY schema_name, object_name;