sys.dm_db_missing_index_details (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-databas i Microsoft Fabric

Returnerar detaljerad information om saknade index.

I Azure SQL Database kan dynamiska hanteringsvyer inte exponera information som skulle påverka databasens inneslutning eller exponera information om andra databaser som användaren har åtkomst 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
index_handle int Identifierar ett särskilt saknat index. Identifieraren är unik över hela servern. index_handle är nyckeln till denna tabell.
database_id smallint Identifierar databasen där tabellen med det saknade indexet finns.

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 Identifierar tabellen där indexet saknas.
equality_columns nvarchar(4000) Kommaseparerad lista över kolumner som bidrar till likhetspredikat av formen:

table.column = constant_value
inequality_columns nvarchar(4000) Kommaseparerad lista av kolumner som bidrar till olikhetspredikat, till exempel predikat av formen:

table.column>constant_value

Alla jämförelseoperatorer utom "=" uttrycker olikhet.
included_columns nvarchar(4000) Kommaseparerad lista över kolumner som behövs som täckande kolumner för frågan. För mer information om täckande eller inkluderade kolumner, se Skapa index med inkluderade kolumner.

För minnesoptimerade index (både hash- och minnesoptimerade icke-klustrade), ignorera included_columns. Alla kolumner i tabellen ingår i varje minnesoptimerat index.
uttalande nvarchar(4000) Namnet på tabellen där indexet saknas.

Anmärkningar

Information som returneras av sys.dm_db_missing_index_details uppdateras när en fråga optimeras av frågeoptimeraren och behålls inte. Saknad indexinformation sparas endast tills databasmotorn startas om. Databasadministratörer bör regelbundet göra säkerhetskopior av den saknade indexinformationen om de vill behålla den 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.

För att avgöra vilka saknade indexgrupper ett visst saknat index tillhör kan du fråga i den sys.dm_db_missing_index_groups dynamiska hanteringsvyn genom att ekkvigera den med sys.dm_db_missing_index_details baserat på kolumnen index_handle .

Anmärkning

Resultatet för denna DMV är begränsat till 600 rader. Varje rad innehåller ett saknat index. Om du har mer än 600 saknade index bör du åtgärda de befintliga saknade indexen så att du kan se de nyare.

Användning av saknad indexinformation i CREATE INDEX-satser

För att konvertera informationen som returneras av sys.dm_db_missing_index_details till en CREATE INDEX-sats för både minnesoptimerade och diskbaserade index, bör likhetskolumner placeras före olikhetskolumnerna, och tillsammans ska de bilda nyckeln till indexet. Inkluderade kolumner bör läggas till i satsen CREATE INDEX med hjälp av INCLUDE-klausulen. För att fastställa en effektiv ordning för likhetskolumnerna beställer du dem baserat på deras selektivitet: lista de mest selektiva kolumnerna först (längst till vänster i kolumnlistan). Läs mer i Tune nonclustered index with missing index-förslag, inklusive begränsningar för missing index-funktionen.

För mer information om minnesoptimerade index, se Index för Memory-Optimized tabeller.

Transaktionskonsistens

Om en transaktion skapar eller släpper en tabell tas raderna som innehåller saknad indexinformation om de borttagna objekten bort från detta dynamiska hanteringsobjekt, vilket bevarar transaktionskonsistensen. Läs mer om begränsningarna med den saknade indexfunktionen.

Permissions

På SQL Server och SQL Managed Instance kräver VIEW SERVER STATE behörighet.

I SQL Database Grundläggande, S0och S1 tjänstmål och för databaser i elastiska pooler, serveradministratör konto, Microsoft Entra-administratör konto eller medlemskap i ##MS_ServerStateReader##serverrollen krävs. För alla andra SQL Database-tjänstmål krävs antingen VIEW DATABASE STATE behörighet för databasen eller medlemskap i ##MS_ServerStateReader## serverrollen.

Behörigheter för SQL Server 2022 och senare

Kräver BEHÖRIGHET FÖR VISNINGSSERVERNS PRESTANDATILLSTÅND på servern.

Examples

Följande exempel ger förslag på saknade index för den aktuella databasen. Saknade indexförslag bör kombineras när det är möjligt med varandra och med befintliga index i den nuvarande databasen. Lär dig hur du kan tillämpa dessa förslag i takt med icke-klustrade index med saknade indexförslag.

SELECT
  CONVERT (varchar(30), getdate(), 126) AS runtime,  mig.index_group_handle,  mid.index_handle,
  CONVERT (decimal (28, 1), migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) ) AS improvement_measure,
  'CREATE INDEX missing_index_' + CONVERT (varchar, mig.index_group_handle) + '_' + CONVERT (varchar, mid.index_handle) + ' ON ' + mid.statement + ' (' + ISNULL (mid.equality_columns, '') + CASE
    WHEN mid.equality_columns IS NOT NULL
    AND mid.inequality_columns IS NOT NULL THEN ','
    ELSE ''
  END + ISNULL (mid.inequality_columns, '') + ')' + ISNULL (' INCLUDE (' + mid.included_columns + ')', '') AS create_index_statement,
  migs.*, mid.database_id, mid.[object_id]
FROM sys.dm_db_missing_index_groups mig
	INNER JOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle
	INNER JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle
WHERE CONVERT (decimal (28, 1),migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans)) > 10
ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC

Anmärkning

Skriptet Index-Creation i Microsofts Tiger Toolbox undersöker saknade index-DMV:er och tar automatiskt bort alla redundanta föreslagna index, parsar ut index med låg påverkan och genererar skript för att skapa index för din granskning. Som i frågan ovan utför den INTE indexskapandekommandon. Skriptet Index-Creation är lämpligt för SQL Server och Azure SQL Managed Instance. Överväg att implementera automatisk indexjustering för Azure SQL Database.

Nästa steg

Läs mer om den saknade indexfunktionen i följande artiklar: