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 databasenVIEW DATABASE STATE
ellerVIEW 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 = NULLVIEW 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)