Dela via


sys.dm_db_index_operational_stats (Transact-SQL)

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Returnerar aktuell I/O på lägre nivå, låsning, låsning och åtkomstmetodaktivitet för varje partition i en tabell eller ett index i databasen.

Minnesoptimerade index visas inte i den här DMV:en.

Not

sys.dm_db_index_operational_stats returnerar inte information om minnesoptimerade index. Information om minnesoptimerad indexanvändning finns i sys.dm_db_xtp_index_stats (Transact-SQL).

Transact-SQL syntaxkonventioner

Syntax

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 }    
)    

Argument

database_id | NULL | 0 | STANDARD

ID för databasen. database_id är smallint. Giltiga indata är ID-numret för en databas, NULL, 0 eller DEFAULT. Standardvärdet är 0. NULL, 0 och DEFAULT är motsvarande värden i den här kontexten.

Ange NULL för att returnera information för alla databaser i SQL Server-instansen. Om du anger NULL för database_idmåste du också ange NULL för object_id, index_idoch partition_number.

Den inbyggda funktionen DB_ID kan anges.

object_id | NULL | 0 | STANDARD

Objekt-ID för tabellen eller visa indexet är aktiverat. object_id är int.

Giltiga indata är ID-numret för en tabell och vy, NULL, 0 eller DEFAULT. Standardvärdet är 0. NULL, 0 och DEFAULT är motsvarande värden i den här kontexten.

Ange NULL för att returnera cachelagrad information för alla tabeller och vyer i den angivna databasen. Om du anger NULL för object_idmåste du också ange NULL för index_id och partition_number.

index_id | 0 | NULL | -1 | STANDARD

ID för indexet. index_id är int. Giltiga indata är ID-numret för ett index, 0 om object_id är en heap, NULL, -1 eller DEFAULT. Standardvärdet är -1, NULL, -1 och DEFAULT är motsvarande värden i den här kontexten.

Ange NULL för att returnera cachelagrad information för alla index för en bastabell eller vy. Om du anger NULL för index_idmåste du också ange NULL för partition_number.

partition_number | NULL | 0 | STANDARD

Partitionsnummer i objektet. partition_number är int. Giltiga indata är partition_number för ett index eller en heap, NULL, 0 eller DEFAULT. Standardvärdet är 0. NULL, 0 och DEFAULT är motsvarande värden i den här kontexten.

Ange NULL för att returnera cachelagrad information för alla partitioner av indexet eller heapen.

partition_number är 1-baserad. Ett icke-partitionerat index eller en heap har partition_number inställt på 1.

Tabell returnerad

Kolumnnamn Datatyp Beskrivning
database_id liten Databas-ID.

I Azure SQL Database är värdena unika i en enskild databas eller en elastisk pool, men inte inom en logisk server.
object_id int ID för tabellen eller vyn.
index_id int ID för indexet eller heapen.

0 = Heap
partition_number int 1-baserat partitionsnummer i indexet eller heapen.
hobt_id bigint gäller för: SQL Server 2016 (13.x) och senare versioner, Azure SQL Database.

ID för datahögen eller B-trädraduppsättningen som spårar interna data för ett kolumnlagringsindex.

NULL – det här är inte en intern kolumnlagringsraduppsättning.

Mer information finns i sys.internal_partitions (Transact-SQL)
leaf_insert_count bigint Kumulativt antal infogningar på lövnivå.
leaf_delete_count bigint Kumulativt antal borttagningar på lövnivå. leaf_delete_count ökas bara för borttagna poster som inte markeras som spöken först. För borttagna poster som spökas först ökas leaf_ghost_count i stället.
leaf_update_count bigint Ackumulerat antal uppdateringar på lövnivå.
leaf_ghost_count bigint Ackumulerat antal lövnivårader som har markerats som borttagna, men som ännu inte har tagits bort. Det här antalet inkluderar inte poster som tas bort omedelbart utan att markeras som spöken. Dessa rader tas bort av en rensningstråd med angivna intervall. Det här värdet inkluderar inte rader som behålls på grund av en utestående transaktion för ögonblicksbildisolering.
nonleaf_insert_count bigint Kumulativt antal infogningar över lövnivån.

0 = Heap eller columnstore
nonleaf_delete_count bigint Ackumulerat antal borttagningar över lövnivån.

0 = Heap eller columnstore
nonleaf_update_count bigint Ackumulerat antal uppdateringar över lövnivån.

0 = Heap eller columnstore
leaf_allocation_count bigint Ackumulerat antal sidallokeringar på lövnivå i indexet eller heapen.

För ett index motsvarar en sidallokering en siddelning.
nonleaf_allocation_count bigint Ackumulerat antal sidallokeringar som orsakas av siddelningar över lövnivån.

0 = Heap eller columnstore
leaf_page_merge_count bigint Ackumulerat antal sidsammanslagningar på lövnivå. Alltid 0 för kolumnlagringsindex.
nonleaf_page_merge_count bigint Ackumulerat antal sidsammanslagningar över lövnivån.

0 = Heap eller columnstore
range_scan_count bigint Ackumulerat antal intervall- och tabellgenomsökningar som startats i indexet eller heapen.
singleton_lookup_count bigint Ackumulerat antal enskilda radhämtningar från indexet eller heapen.
forwarded_fetch_count bigint Antal rader som hämtades via en vidarebefordranpost.

0 = Index
lob_fetch_in_pages bigint Ackumulerat antal stora objektsidor (LOB) som hämtats från LOB_DATA allokeringsenhet. Dessa sidor innehåller data som lagras i kolumner av typen text, ntext, bild, varchar(max), nvarchar(max), varbinary(max)och xml-. Mer information finns i datatyper (Transact-SQL).
lob_fetch_in_bytes bigint Ackumulerat antal LOB-databyte som hämtats.
lob_orphan_create_count bigint Ackumulerat antal överblivna LOB-värden som skapats för massåtgärder.

0 = Icke-grupperat index
lob_orphan_insert_count bigint Ackumulerat antal överblivna LOB-värden som infogats under massåtgärder.

0 = Icke-grupperat index
row_overflow_fetch_in_pages bigint Ackumulerat antal datasidor med rad-overflow som hämtats från ROW_OVERFLOW_DATA allokeringsenhet.

Dessa sidor innehåller data som lagras i kolumner av typen varchar(n), nvarchar(n), varbinary(n)och sql_variant som har push-överförts från rad.
row_overflow_fetch_in_bytes bigint Ackumulerat antal databyte för rad-overflow som hämtats.
column_value_push_off_row_count bigint Ackumulerat antal kolumnvärden för LOB-data och rad-overflow-data som skickas utanför rad för att få en infogad eller uppdaterad rad att passa in på en sida.
column_value_pull_in_row_count bigint Ackumulerat antal kolumnvärden för LOB-data och rad-overflow-data som hämtas på rad. Detta inträffar när en uppdateringsåtgärd frigör utrymme i en post och ger möjlighet att hämta ett eller flera värden från LOB_DATA eller ROW_OVERFLOW_DATA allokeringsenheter till IN_ROW_DATA allokeringsenhet.
row_lock_count bigint Ackumulerat antal begärda radlås.
row_lock_wait_count bigint Ackumulerat antal gånger databasmotorn väntade på ett radlås.
row_lock_wait_in_ms bigint Totalt antal millisekunder som databasmotorn väntade på ett radlås.
page_lock_count bigint Kumulativt antal begärda sidlås.
page_lock_wait_count bigint Ackumulerat antal gånger databasmotorn väntade på ett sidlås.
page_lock_wait_in_ms bigint Totalt antal millisekunder som databasmotorn väntade på ett sidlås.
index_lock_promotion_attempt_count bigint Ackumulerat antal gånger som databasmotorn försökte eskalera lås.
index_lock_promotion_count bigint Ackumulerat antal gånger databasmotorn eskalerade lås.
page_latch_wait_count bigint Kumulativt antal gånger databasmotorn väntade på grund av spärrkonkurration.
page_latch_wait_in_ms bigint Ackumulerat antal millisekunder som databasmotorn väntade på grund av spärrkonkurration.
page_io_latch_wait_count bigint Ackumulerat antal gånger databasmotorn väntade på en I/O-sidspärr.
page_io_latch_wait_in_ms bigint Ackumulerat antal millisekunder som databasmotorn väntade på en sid-I/O-spärr.
tree_page_latch_wait_count bigint Delmängd av page_latch_wait_count som endast innehåller B-trädsidor på den övre nivån. Alltid 0 för ett heap- eller kolumnlagringsindex.
tree_page_latch_wait_in_ms bigint Delmängd av page_latch_wait_in_ms som endast innehåller B-trädsidor på den övre nivån. Alltid 0 för ett heap- eller kolumnlagringsindex.
tree_page_io_latch_wait_count bigint Delmängd av page_io_latch_wait_count som endast innehåller B-trädsidor på den övre nivån. Alltid 0 för ett heap- eller kolumnlagringsindex.
tree_page_io_latch_wait_in_ms bigint Delmängd av page_io_latch_wait_in_ms som endast innehåller B-trädsidor på den övre nivån. Alltid 0 för ett heap- eller kolumnlagringsindex.
page_compression_attempt_count bigint Antal sidor som utvärderats för SID-nivåkomprimering för specifika partitioner i en tabell, ett index eller en indexerad vy. Innehåller sidor som inte komprimerades eftersom betydande besparingar inte kunde uppnås. Alltid 0 för kolumnlagringsindex.
page_compression_success_count bigint Antal datasidor som komprimerades med hjälp av PAGE-komprimering för specifika partitioner i en tabell, ett index eller en indexerad vy. Alltid 0 för kolumnlagringsindex.

Not

I dokumentationen används termen B-träd vanligtvis som referens till index. I radlagringsindex implementerar databasmotorn ett B+-träd. Detta gäller inte för kolumnlagringsindex eller index i minnesoptimerade tabeller. Mer information finns i arkitekturen och designguiden för SQL Server och Azure SQL-index.

Anmärkningar

Det här dynamiska hanteringsobjektet accepterar inte korrelerade parametrar från CROSS APPLY och OUTER APPLY.

Du kan använda sys.dm_db_index_operational_stats för att spåra hur lång tid användarna måste vänta med att läsa eller skriva till en tabell, ett index eller en partition och identifiera de tabeller eller index som drabbas av betydande I/O-aktivitet eller hot spots.

Använd följande kolumner för att identifiera konkurrensområden.

Om du vill analysera ett vanligt åtkomstmönster till tabellen eller indexpartitionenanvänder du följande kolumner:

  • leaf_insert_count

  • leaf_delete_count

  • leaf_update_count

  • leaf_ghost_count

  • range_scan_count

  • singleton_lookup_count

Använd följande kolumner för att identifiera spärrning och låsningskonkurring:

  • page_latch_wait_count och page_latch_wait_in_ms

    Dessa kolumner anger om det finns spärrkonkurration på indexet eller heapen och betydelsen av konkurrensen.

  • row_lock_count och page_lock_count

    Dessa kolumner anger hur många gånger databasmotorn försökte hämta rad- och sidlås.

  • row_lock_wait_in_ms och page_lock_wait_in_ms

    Dessa kolumner anger om det finns låskonkurration på indexet eller heapen och betydelsen av konkurrensen.

Analysera statistik för fysisk I/Os på ett index eller en heap-partition

  • page_io_latch_wait_count och page_io_latch_wait_in_ms

    Dessa kolumner anger om fysisk I/Os utfärdades för att föra in index- eller heapsidorna i minnet och hur många I/Os som utfärdades.

Kolumnkommentarer

Värdena i lob_orphan_create_count och lob_orphan_insert_count ska alltid vara lika.

Värdet i kolumnerna lob_fetch_in_pages och lob_fetch_in_bytes kan vara större än noll för icke-grupperade index som innehåller en eller flera LOB-kolumner som inkluderade kolumner. Mer information finns i Skapa index med inkluderade kolumner. På samma sätt kan värdet i kolumnerna row_overflow_fetch_in_pages och row_overflow_fetch_in_bytes vara större än 0 för icke-illustrerade index om indexet innehåller kolumner som kan push-överföras utanför rad.

Så återställs räknarna i metadatacachen

De data som returneras av sys.dm_db_index_operational_stats finns bara så länge metadatacacheobjektet som representerar heapen eller indexet är tillgängligt. Dessa data är varken beständiga eller transaktionsmässigt konsekventa. Det innebär att du inte kan använda dessa räknare för att avgöra om ett index har använts eller inte, eller när indexet senast användes. Information om detta finns i sys.dm_db_index_usage_stats (Transact-SQL).

Värdena för varje kolumn anges till noll när metadata för heapen eller indexet förs in i metadatacachen och statistik ackumuleras tills cacheobjektet tas bort från metadatacachen. Därför kommer en aktiv heap eller ett aktivt index förmodligen alltid att ha sina metadata i cacheminnet, och de kumulativa antalet kan återspegla aktiviteten eftersom instansen av SQL Server senast startades. Metadata för en mindre aktiv heap eller ett index flyttas in och ut ur cacheminnet när de används. Det kan leda till att den kanske inte har några tillgängliga värden. Om du tar bort ett index tas motsvarande statistik bort från minnet och rapporteras inte längre av funktionen. Andra DDL-åtgärder mot indexet kan göra att värdet för statistiken återställs till noll.

Använda systemfunktioner för att ange parametervärden

Du kan använda Transact-SQL-funktionerna DB_ID och OBJECT_ID för att ange ett värde för parametrarna database_id och object_id. Att skicka värden som inte är giltiga för dessa funktioner kan dock orsaka oavsiktliga resultat. Kontrollera alltid att ett giltigt ID returneras när du använder DB_ID eller OBJECT_ID. Mer information finns i avsnittet Anmärkningar i sys.dm_db_index_physical_stats (Transact-SQL).

Behörigheter

Kräver följande behörigheter:

  • CONTROL behörighet för det angivna objektet i databasen

  • VIEW DATABASE STATE eller VIEW DATABASE PERFORMANCE STATE (SQL Server 2022) behörighet att returnera information om alla objekt i den angivna databasen med hjälp av objektet jokertecken @object_id = NULL

  • VIEW SERVER STATE VIEW SERVER PERFORMANCE STATE (SQL Server 2022) behörighet att returnera information om alla databaser med hjälp av databasens jokertecken @database_id = NULL

Om du beviljar VIEW DATABASE STATE kan alla objekt i databasen returneras, oavsett vilka KONTROLLbehörigheter som nekas för specifika objekt.

Om du nekar VIEW DATABASE STATE tillåts inte att alla objekt i databasen returneras, oavsett vilka KONTROLLbehörigheter som beviljas för specifika objekt. När databasens jokertecken @database_id=NULL anges utelämnas databasen.

Mer information finns i Dynamiska hanteringsvyer och funktioner (Transact-SQL).

Exempel

A. Returnera information för en angiven tabell

I följande exempel returneras information för alla index och partitioner i tabellen Person.Address i databasen AdventureWorks2022. För att köra den här frågan krävs minst KONTROLL-behörighet för Person.Address tabell.

Viktig

När du använder Transact-SQL-funktionerna DB_ID och OBJECT_ID för att returnera ett parametervärde kontrollerar du alltid att ett giltigt ID returneras. Om databasen eller objektnamnet inte kan hittas, till exempel när de inte finns eller stavas felaktigt, returnerar båda funktionerna NULL. Funktionen sys.dm_db_index_operational_stats tolkar NULL som ett jokerteckenvärde som anger alla databaser eller alla objekt. Eftersom detta kan vara en oavsiktlig åtgärd visar exemplen i det här avsnittet det säkra sättet att fastställa databas- och objekt-ID:t.

DECLARE @db_id int;    
DECLARE @object_id int;    
SET @db_id = DB_ID(N'AdventureWorks2022');    
SET @object_id = OBJECT_ID(N'AdventureWorks2022.Person.Address');    
IF @db_id IS NULL     
  BEGIN;    
    PRINT N'Invalid database';    
  END;    
ELSE IF @object_id IS NULL    
  BEGIN;    
    PRINT N'Invalid object';    
  END;    
ELSE    
  BEGIN;    
    SELECT * FROM sys.dm_db_index_operational_stats(@db_id, @object_id, NULL, NULL);    
  END;    
GO    

B. Returnera information för alla tabeller och index

I följande exempel returneras information för alla tabeller och index i SQL Server-instansen. För att köra den här frågan krävs behörigheten VISA SERVERTILLSTÅND.

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

Se även

Dynamiska hanteringsvyer och funktioner (Transact-SQL)
Index related Dynamic Management Views and Functions (Transact-SQL)
Övervaka och finjustera prestanda
sys.dm_db_index_physical_stats (Transact-SQL)
sys.dm_db_index_usage_stats (Transact-SQL)
sys.dm_os_latch_stats (Transact-SQL)
sys.dm_db_partition_stats (Transact-SQL)
sys.allocation_units (Transact-SQL)
sys.indexes (Transact-SQL)