Indexnutzungsstatistik DMV zeigt keine Indexaktivität an

7

Ich versuche Informationen über Indizes zu erhalten. Laut mehreren Websites sollte die folgende TSQL-Abfrage Informationen zu Indizes mit der Indextabelle verknüpfen und Indizes und verwandte Informationen zurückgeben. Die folgende Abfrage wird auf den Bare Join vereinfacht, da ich gerade versuche, Daten zurückzugeben, und von dort aus werde ich zurückgeben, was ich brauche:

SELECT *
FROM sys.indexes i
     INNER JOIN sys.dm_db_index_usage_stats s ON i.object_id = s.object_id

Diese Abfrage gibt nichts zurück. In mehreren Datenbanken gibt es jedoch Hunderte von Tabellen mit mindestens einem Index. Gemäß verschiedenen Online-Artikeln sollte diese Abfrage diese Indizes zurückgeben (da sie sich auf die Objekt-IDs bezieht). Wenn ich versuche, die Abfrage in die folgende Abfrage zu ändern, wird auch nichts zurückgegeben:

SELECT *
FROM DATABASENAME.sys.indexes i
    INNER JOIN DATABASENAME.sys.dm_db_index_usage_stats s ON i.object_id = s.object_id

Warum gibt diese Abfrage keine Daten zurück?

Hinzugefügt

Wenn ich die folgenden Abfragen ausführe, erhalte ich Daten von diesen beiden SELECTAbfragen:

SELECT *
FROM sys.indexes

SELECT *
FROM sys.dm_db_index_usage_stats

Das Problem (bei der ursprünglichen Abfrage) ist der object_idJoin. Ich weiß jedoch nicht, warum ich Objekte in einer Tabelle habe, die in einer anderen nicht vorhanden sind.

Endgültig: Martin hatte ursprünglich die richtige Antwort - obwohl Daten aus der sys.dm_db_index_usage_statsTabelle zurückgegeben wurden, befanden sie sich in der msdbDatenbank, nicht in der spezifischen Datenbank, die ich suchte. Ich habe erneut Abfragen für Tabellen ausgeführt und die Datenbank-ID in der Tabelle gefunden. Unsicher, warum in der sys.dm_db_index_usage_statsTabelle keine Daten aus früheren Abfragen in dieser Datenbank gespeichert wurden.

user123
quelle
Welcher Datenbankbenutzer führt die Abfrage aus und welche Berechtigungen hat dieser Benutzer?
Frambot
@MartinSmith Wenn ich sa verwende und SQL Server Express auf meinem lokalen Computer mit Tabellen ausführe, die Indizes enthalten, wird auch nichts zurückgegeben.
@MartinSmith Ja, beide Tabellen geben Daten einzeln zurück.
Keine Nutzungsstatistiken?
2
Ah re deine Bearbeitung. SQL Express schließt Datenbanken standardmäßig automatisch, sodass Sie sie dann wahrscheinlich verlieren.
Martin Smith

Antworten:

8

Eine Möglichkeit wäre, dass Sie nicht über ausreichende Berechtigungen zum Anzeigen der Metadaten verfügen.

Ein weiterer Grund ist , dass sys.dm_db_index_usage_statsnur Berichte über Indizes, die mindestens einmal verwendet wurden , da der Server wurde zuletzt neu gestartet. Ebenfalls

Wenn eine Datenbank getrennt oder heruntergefahren wird (z. B. weil AUTO_CLOSE auf ON gesetzt ist), werden alle der Datenbank zugeordneten Zeilen entfernt.

AUTO_CLOSE ist die Standardeinstellung für SQL Server Express.

Sie müssen nach filtern, sys.dm_db_index_usage_statsum database_idfestzustellen, ob Metadaten für eine bestimmte Datenbank geladen wurden, die auch der Join enthalten sollteindex_id

SELECT *
FROM   sys.indexes i
       LEFT JOIN sys.dm_db_index_usage_stats s
         ON i.object_id = s.object_id
            AND i.index_id = s.index_id
            AND s.database_id = DB_ID() 
Martin Smith
quelle