sys.dm_db_missing_index_group_stats_query (Transact-SQL)

Gäller för: SQL Server 2019 (15.x) och senare versioner Azure SQL DatabaseAzure SQL Managed InstanceSQL Database i Microsoft Fabric

Returnerar information om frågor som behövde ett saknat index från grupper av saknade index, exklusive rumsliga index. Mer än en fråga kan returneras per saknad indexgrupp. En saknad indexgrupp kunde ha flera frågor som behövde samma index.

I Azure SQL Database kan dynamiska hanteringsvyer inte exponera information som skulle påverka databasens innehåll, eller exponera information om andra databaser som användaren har tillgång till. För att undvika att exponera den här informationen filtreras varje rad som innehåller data som inte tillhör den anslutna klientorganisationen bort.

Kolumnnamn Datatyp Description
group_handle int Identifierar en grupp saknade index. Denna identifierare är unik över hela servern.

De andra kolumnerna ger information om alla frågor där indexet i gruppen anses saknas.

En indexgrupp innehåller endast ett index.

Kan anslutas till index_group_handlei sys.dm_db_missing_index_groups.
query_hash binary(8) Binär hash-värde som beräknas på frågan och används för att identifiera frågor med liknande logik. Du kan använda frågehashen för att fastställa den aggregerade resursanvändningen för frågor som endast skiljer sig åt med literalvärden.
query_plan_hash binary(8) Binär hash-värde som beräknas på frågekörningsplanen och används för att identifiera liknande frågekörningsplaner. Du kan använda hash för frågeplan för att hitta den kumulativa kostnaden för frågor med liknande körningsplaner.

Alltid 0x000 när en nativt kompilerad lagrad procedur frågar en minnesoptimerad tabell.
last_sql_handle varbinary(64) En token som unikt identifierar batchen eller den lagrade proceduren för det senaste kompilerade satsen som behövde detta index.

De last_sql_handle kan användas för att hämta SQL-texten i frågan genom att anropa den dynamiska hanteringsfunktionen sys.dm_exec_sql_text.
last_statement_start_offset int Indikerar, i bytes, som börjar med 0, startpositionen för den fråga som raden beskriver i texten i sin batch eller persisterade objekt för det senaste kompilerade satsen som behövde detta index i sin SQL-batch.
last_statement_end_offset int Indikerar, i bytes, med början på 0, slutpositionen för den fråga som raden beskriver inom texten i dess batch eller persisterade objekt, för den senaste kompilerade satsen som behövde detta index i sin SQL-batch.
last_statement_sql_handle varbinary(64) En token som unikt identifierar batchen eller den lagrade proceduren för det senaste kompilerade satsen som behövde detta index. Används av Query Store. Till skillnad från last_sql_handle, sys.query_store_query_text refererar till den statement_sql_handle som används av Query Store-katalogvyn sys.query_store_query_text.

Returneras 0 om Query Store inte var aktiverat när frågan kompilerades.
user_seeks bigint Antal sökningar orsakade av användarfrågor som det rekommenderade indexet i gruppen kunde ha använts för.
user_scans bigint Antal skanningar orsakade av användarfrågor som det rekommenderade indexet i gruppen kunde ha använts för.
last_user_seek datetime Datum och tid för senaste sökning orsakad av användarfrågor som det rekommenderade indexet i gruppen kunde ha använts för.
last_user_scan datetime Datum och tid för senaste skanning orsakad av användarfrågor som det rekommenderade indexet i gruppen kunde ha använts för.
avg_total_user_cost float Genomsnittlig kostnad för användarfrågorna som kan minskas av indexet i gruppen.
avg_user_impact float Genomsnittlig procentuell fördel som användarfrågor skulle kunna uppleva om denna saknade indexgrupp implementerades. Värdet innebär att frågekostnaden i genomsnitt skulle minska med denna procentandel om denna saknade indexgrupp implementerades.
system_seeks bigint Antal sökningar orsakade av systemfrågor, såsom autostatistikfrågor, som det rekommenderade indexet i gruppen kunde ha använts för. För mer information, se Auto Stats Event Class.
system_scans bigint Antal skanningar orsakade av systemfrågor som det rekommenderade indexet i gruppen kunde ha använts för.
last_system_seek datetime Datum och tid för senaste systemsökning orsakad av systemfrågor som det rekommenderade indexet i gruppen kunde ha använts för.
last_system_scan datetime Datum och tid för senaste systemskanning orsakad av systemfrågor som det rekommenderade indexet i gruppen kunde ha använts för.
avg_total_system_cost float Genomsnittskostnaden för systemfrågorna som kan minskas av indexet i gruppen.
avg_system_impact float Genomsnittlig procentuell fördel som systemfrågor kan uppleva om denna saknade indexgrupp implementerades. Värdet innebär att frågekostnaden i genomsnitt skulle minska med denna procentandel om denna saknade indexgrupp implementerades.

Anmärkningar

Informationen som returneras av sys.dm_db_missing_index_group_stats_query uppdateras vid varje frågeexekvering, inte vid varje frågekompilering eller omkompilering. Användningsstatistik sparas inte och sparas endast tills databasmotorn startas om.

Databasadministratörer bör periodvis göra säkerhetskopior av den saknade indexinformationen om de vill behålla användningsstatistiken efter serveråtervinning. Använd kolumnen sqlserver_start_time i sys.dm_os_sys_info för att hitta den senaste starttiden för databasmotorn. Du kan också behålla saknade index med Query Store.

Permissions

För att söka denna dynamiska hanteringsvy måste användare beviljas VIEW SERVER STATE den behörighet eller någon behörighet som innebär denna VIEW SERVER STATE behörighet, för SQL Server 2019 (15.x) och tidigare versioner.

Kräver behörighet VIEW SERVER PERFORMANCE STATE på servern, för SQL Server 2022 (16.x) och senare versioner.

Examples

Följande exempel illustrerar hur man använder den dynamiska sys.dm_db_missing_index_group_stats_query hanteringsvyn.

A. Hitta den senaste frågetexten för de tio högst förväntade förbättringarna för användarfrågor

Följande fråga returnerar den senaste registrerade frågetexten för de 10 saknade indexen som skulle ge den högsta förväntade kumulativa förbättringen, i fallande ordning.

SELECT TOP 10
    SUBSTRING
    (
            sql_text.text,
            misq.last_statement_start_offset / 2 + 1,
            (
            CASE misq.last_statement_start_offset
                WHEN -1 THEN DATALENGTH(sql_text.text)
                ELSE misq.last_statement_end_offset
            END - misq.last_statement_start_offset
            ) / 2 + 1
    ),
    misq.*
FROM sys.dm_db_missing_index_group_stats_query AS misq
CROSS APPLY sys.dm_exec_sql_text(misq.last_sql_handle) AS sql_text
ORDER BY misq.avg_total_user_cost
    * misq.avg_user_impact
    * (misq.user_seeks + misq.user_scans) DESC;