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 SELECT
Abfragen:
SELECT *
FROM sys.indexes
SELECT *
FROM sys.dm_db_index_usage_stats
Das Problem (bei der ursprünglichen Abfrage) ist der object_id
Join. 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_stats
Tabelle zurückgegeben wurden, befanden sie sich in der msdb
Datenbank, 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_stats
Tabelle keine Daten aus früheren Abfragen in dieser Datenbank gespeichert wurden.
quelle
Antworten:
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_stats
nur Berichte über Indizes, die mindestens einmal verwendet wurden , da der Server wurde zuletzt neu gestartet. EbenfallsAUTO_CLOSE
ist die Standardeinstellung für SQL Server Express.Sie müssen nach filtern,
sys.dm_db_index_usage_stats
umdatabase_id
festzustellen, ob Metadaten für eine bestimmte Datenbank geladen wurden, die auch der Join enthalten sollteindex_id
quelle