Delen via


sys.dm_db_missing_index_details (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-database in Microsoft Fabric

Geeft gedetailleerde informatie over ontbrekende indexen.

In Azure SQL Database kunnen dynamische beheerweergaven geen informatie weergeven die van invloed is op databaseinsluiting of informatie weergeven over andere databases waartoe de gebruiker toegang heeft. Om te voorkomen dat deze informatie zichtbaar wordt gemaakt, wordt elke rij met gegevens die geen deel uitmaken van de verbonden tenant uitgefilterd.

Kolomnaam Gegevenstype Description
index_handle int Identificeert een specifieke ontbrekende index. De identificatie is uniek binnen de server. index_handle is de sleutel van deze tabel.
database_id smallint Identificeert de database waar de tabel met de ontbrekende index zich bevindt.

In Azure SQL Database zijn de waarden uniek binnen één database of een elastische pool, maar niet binnen een logische server.
object_id int Identificeert de tabel waarin de index ontbreekt.
equality_columns nvarchar(4000) Comma-gescheiden lijst van kolommen die bijdragen aan gelijkheidspredicaten van de vorm:

table.column = constant_value
inequality_columns nvarchar(4000) Comma-gescheiden lijst van kolommen die bijdragen aan ongelijkheidspredicaten, bijvoorbeeld predicaten van de vorm:

table.column>constant_value

Elke vergelijkingsoperator anders dan "=" drukt ongelijkheid uit.
included_columns nvarchar(4000) Comma-gescheiden lijst van kolommen die nodig zijn als dekkende kolommen voor de query. Voor meer informatie over het bedekken of opgenomen kolommen, zie Indexen aanmaken met opgenomen kolommen.

Voor geheugen-geoptimaliseerde indexen (zowel hash- als geheugengeoptimaliseerde niet-geclusterde), negeer included_columns. Alle kolommen van de tabel zijn opgenomen in elke geheugengeoptimaliseerde index.
verklaring nvarchar(4000) Naam van de tabel waar de index ontbreekt.

Opmerkingen

Informatie die door sys.dm_db_missing_index_details wordt teruggestuurd, wordt bijgewerkt wanneer een query wordt geoptimaliseerd door de queryoptimizer en wordt niet behouden. Ontbrekende indexinformatie wordt alleen bewaard totdat de database-engine opnieuw is opgestart. Databasebeheerders zouden periodiek back-ups moeten maken van de ontbrekende indexinformatie als ze deze na serverrecycling willen behouden. Gebruik de kolom sqlserver_start_time in sys.dm_os_sys_info om de laatste opstarttijd van de database-engine te vinden.

Om te bepalen bij welke ontbrekende indexgroepen een bepaalde ontbrekende index hoort, kun je de sys.dm_db_missing_index_groups dynamische beheerweergave bevragen door deze te equijoinen met sys.dm_db_missing_index_details op basis van de index_handle kolom.

Opmerking

De uitkomsten voor deze DMV zijn beperkt tot 600 rijen. Elke rij bevat één ontbrekende index. Als je meer dan 600 ontbrekende indexen hebt, moet je de bestaande ontbrekende indexen aanpakken zodat je daarna de nieuwere kunt bekijken.

Gebruik van ontbrekende indexinformatie in CREATE INDEX-instructies

Om de door de door gegenereerde sys.dm_db_missing_index_details informatie om te zetten in een CREATE INDEX-instructie voor zowel geheugengeoptimaliseerde als schijfgebaseerde indexen, moeten gelijkheidskolommen vóór de ongelijkheidskolommen worden geplaatst, en samen zouden ze de sleutel van de index moeten vormen. Opgenomen kolommen moeten worden toegevoegd aan de CREATE INDEX-instructie met behulp van de INCLUDE-clausule. Als u een effectieve volgorde voor de gelijkheidskolommen wilt bepalen, rangschikt u ze op basis van hun selectiviteit: geef eerst de meest selectieve kolommen weer (meest links in de kolomlijst). Lees meer in Tune non-clustered indexes with missing index-suggesties, inclusief Beperkingen van de missing index-functie.

Voor meer informatie over geheugen-geoptimaliseerde indexen, zie Indexen voor Memory-Optimized Tabellen.

Transactieconsistentie

Als een transactie een tabel aanmaakt of verwijdert, worden de rijen met ontbrekende indexinformatie over de gedropte objecten uit dit dynamische beheerobject verwijderd, waardoor de consistentie van de transactie behouden blijft. Lees meer over de beperkingen van de ontbrekende indexfunctie.

Permissions

Voor SQL Server en SQL Managed Instance is een machtiging vereist VIEW SERVER STATE .

Voor servicedoelstellingen van SQL Database Basic, S0 en S1 en voor databases in elastische pools is het serverbeheerdersaccount , het Microsoft Entra-beheerdersaccount of het lidmaatschap van de ##MS_ServerStateReader##serverrol vereist. Voor alle andere SQL Database-servicedoelstellingen is de VIEW DATABASE STATE machtiging voor de database of het lidmaatschap van de ##MS_ServerStateReader## serverfunctie vereist.

Machtigingen voor SQL Server 2022 en hoger

Vereist de machtiging PRESTATIESTATUS VAN DE WEERGAVESERVER op de server.

Voorbeelden

Het volgende voorbeeld geeft suggesties voor ontbrekende indexen voor de huidige database. Ontbrekende indexsuggesties moeten waar mogelijk worden gecombineerd met elkaar en met bestaande indexen in de huidige database. Leer hoe je deze suggesties toepast om niet-geclusterde indexen met ontbrekende indexsuggesties af te stemmen.

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

Opmerking

Het script voor het maken van indexen in de Tiger Toolbox van Microsoft onderzoekt ontbrekende index-DMV's en verwijdert automatisch overbodige voorgestelde indexen, parseert indexen met lage impact en genereert scripts voor het maken van indexen voor uw beoordeling. Zoals in de bovenstaande query voert het GEEN indexcreatiecommando's uit. Het script voor het maken van indexen is geschikt voor SQL Server en Azure SQL Managed Instance. Voor Azure SQL Database kunt u overwegen automatische indexafstemming te implementeren.

Volgende stappen

Lees meer over de ontbrekende indexfunctie in de volgende artikelen: