Wie erhalte ich eine Liste aller Index- und Indexspalten in SQL Server 2005+? Das nächste, was ich bekommen könnte, ist:
select s.name, t.name, i.name, c.name from sys.tables t
inner join sys.schemas s on t.schema_id = s.schema_id
inner join sys.indexes i on i.object_id = t.object_id
inner join sys.index_columns ic on ic.object_id = t.object_id
inner join sys.columns c on c.object_id = t.object_id and
ic.column_id = c.column_id
where i.index_id > 0
and i.type in (1, 2) -- clustered & nonclustered only
and i.is_primary_key = 0 -- do not include PK indexes
and i.is_unique_constraint = 0 -- do not include UQ
and i.is_disabled = 0
and i.is_hypothetical = 0
and ic.key_ordinal > 0
order by ic.key_ordinal
Welches ist nicht genau das, was ich will.
Ich möchte alle benutzerdefinierten Indizes ( dh keine Indizes, die eindeutige Einschränkungen und Primärschlüssel unterstützen ) mit allen Spalten (sortiert nach ihrer Darstellung in der Indexdefinition) sowie möglichst vielen Metadaten auflisten.
sql-server
tsql
indexing
reverse-engineering
Anton Gogolev
quelle
quelle
Antworten:
Es gibt zwei "sys" -Katalogansichten, die Sie einsehen können:
Diese geben Ihnen fast alle Informationen, die Sie möglicherweise über Indizes und ihre Spalten wünschen könnten.
BEARBEITEN: Diese Abfrage kommt dem, was Sie suchen, ziemlich nahe:
quelle
is_ms_shipped=0
) erhalten, aber keine Primärschlüssel (is_primary_key=0
) und keine Indizes, die nur zur Unterstützung eindeutiger Einschränkungen erstellt wurden (is_unique_constraint=0
).WHERE (1=1)
ließ ihn seineAND ...
s verketten und neu ordnen, ohne sich Gedanken darüber zu machen, welche zuerst war. Siehe: stackoverflow.com/a/8149183/1160796 und stackoverflow.com/a/242831/1160796Mit können Sie
sp_helpindex
alle Indizes einer Tabelle anzeigen.Und für alle Indizes können Sie
sys.objects
alle Indizes für jede Tabelle abrufen.quelle
Keiner der oben genannten hat den Job für mich gemacht, aber das macht:
Wenn Ihre Namen Leerzeichen enthalten, fügen Sie in den Erstellungsskripten eckige Klammern hinzu.
Wenn die letzte Schlüsselspalte alle Nullen enthält, wissen Sie, dass keine fehlen.
Das Herausfiltern von Primärschlüsseln usw. wie in der ursprünglichen Anforderung ist trivial.
HINWEIS: Seien Sie vorsichtig mit dieser Lösung, da sie nicht zwischen indizierten und enthaltenen Spalten unterscheidet.
quelle
--Kurz und bündig:
quelle
Das Folgende funktioniert unter SQL Server 2014/2016 sowie in jeder Microsoft Azure SQL-Datenbank.
Erzeugt eine umfassende Ergebnismenge, die zum Schneiden und Würfeln leicht in Notepad / Excel exportiert werden kann und enthält
quelle
Hey Leute, ich bin nicht durchgegangen, aber ich habe in der Abfrage des ursprünglichen Autors bekommen, was ich wollte.
Ich habe es (ohne Bedingungen / Filter) für meine Anforderung verwendet, aber es ergab falsche Ergebnisse
Das Hauptproblem war, dass die Ergebnisse produktübergreifend ohne Verknüpfungsbedingung für index_id erhalten wurden
quelle
Ich musste bestimmte Indizes, ihre Indexspalten und ihre enthaltenen Spalten erhalten. Hier ist die Abfrage, die ich verwendet habe:
quelle
SELECT
, um dieCREATE
Anweisungen zu generieren :,CreateStatement = 'CREATE INDEX [' + INX.[name] + '] ON dbo.[' + TBL.[name] + '] (' + REPLACE(DS1.IndexColumnsNames, '] [', '], [') + ')' + CASE WHEN DS2.IncludedColumnsNames IS NOT NULL THEN ' INCLUDE (' + REPLACE(DS2.IncludedColumnsNames, '] [', '], [') + ')' ELSE '' END
.Im Folgenden wird der Tabellenname sp_helpindex angegeben
quelle
Basierend auf der akzeptierten Antwort und zwei weiteren Fragen 1 , 2 habe ich die folgende Abfrage zusammengestellt:
Diese Abfrage gibt Ergebnisse wie die folgenden zurück, in denen die Liste der Indizes, ihre Spalten und ihre Verwendung angezeigt werden. Sehr hilfreich bei der Bestimmung, welcher Index besser abschneidet als andere:
quelle
das wird funktionieren:
Dadurch wird der Tabellenname nicht zurückgegeben, und Sie erhalten Warnungen für alle Tabellen ohne Index. Wenn dies ein Problem darstellt, können Sie eine Schleife über die Tabellen mit folgenden Indizes erstellen:
BEARBEITEN
Wenn Sie möchten, können Sie die Daten filtern. Hier einige Beispiele (diese funktionieren für beide Methoden):
quelle
quelle
index_column_id
ist nicht die Reihenfolge der Spalten in der PK, sondern in der Tabelle! Verwenden Siekey_ordinal
stattdessen.Dies ist eine Möglichkeit, in die Indizes zurückzukehren. Sie können SHOWCONTIG verwenden, um die Fragmentierung zu bewerten. Es werden alle Indizes für die Datenbank oder Tabelle zusammen mit Statistiken aufgelistet. Ich würde darauf hinweisen, dass eine große Datenbank eine lange Laufzeit haben kann. Für mich ist einer der Vorteile dieses Ansatzes, dass Sie kein Administrator sein müssen, um ihn zu verwenden.
- Fragmentierungsinformationen für alle Indizes in einer Datenbank anzeigen
... schalten Sie NOCOUNT wieder aus, wenn Sie fertig sind
- Zeigt Fragmentierungsinformationen für alle Indizes in einer Tabelle an
- Fragmentierungsinformationen für einen bestimmten Index anzeigen
quelle
Darf ich eine weitere Antwort auf diese gesättigte Frage riskieren?
Dies ist eine liberale Überarbeitung der Antwort von @marc_s, gemischt mit einigen Dingen von @Tim Ford, mit dem Ziel, eine sauberere und einfachere Ergebnismenge sowie eine endgültige Anzeige und Bestellung für meinen aktuellen Bedarf zu erzielen.
quelle
Basierend auf dem Tim Ford Code ist dies die richtige Antwort:
quelle
index_column_id
ist nicht die Reihenfolge der Spalten in der PK, sondern in der Tabelle! Verwenden Siekey_ordinal
stattdessen.Ich habe mir diesen ausgedacht, der mir genau den Überblick gibt, den ich brauche. Hilfreich ist, dass Sie eine Zeile pro Index erhalten, in der die Indexspalten zusammengefasst sind.
quelle
Da Ihr Profil besagt , dass Sie .NET verwenden Sie können Server Managed Objects (SMO) programmatisch verwenden ... sonst eine der oben genannten Antworten sind fantastisch.
quelle
Die obige Lösung ist elegant, aber laut MS wird INDEXKEY_PROPERTY nicht mehr unterstützt. Siehe: http://msdn.microsoft.com/en-us/library/ms186773.aspx
quelle
In Oracle
In SQL Server mit
quelle
Beachten Sie nur, dass Sie, wenn Sie eine der oben genannten Arbeitsabfragen zum Skripten Ihrer Indizes verwenden möchten, die Spalte filter_definition aus der Tabelle sys.indexes in Ihre Abfragen integrieren müssen, um die Filterdefinition von nicht gruppierten Indizes in SQL 2008+ abzurufen
AM
quelle
Die folgende Abfrage enthält alle relevanten Informationen für die benutzerdefinierten Indizes (keine Indizes für eindeutige Einschränkungen und Primärschlüssel) mit allen Spalten:
Als zusätzlichen Bonus wird die folgende Abfrage formatiert, um die Skripte zum Erstellen von Indizes und zum Löschen von Indizes zu schreiben:
quelle
Dies ist meins, funktioniert mit einem Standardschema, kann aber leicht verbessert werden. Es gibt 3 Spalten mit SQLQueries - Erstellen / Löschen / Neu erstellen (keine Neuorganisation)
Abfrage:
Ausgabe
quelle
Beachten Sie zunächst, dass bei allen oben genannten Abfragen möglicherweise die INCLUDE- Spalten der Indizes fehlen oder fälschlicherweise enthalten sind. In einigen Fällen fehlt auch die richtige Reihenfolge und / oder ASC / DESC-Option der Spalten.
Die obige Abfrage wurde von jona geändert. Abgesehen davon installiere ich in vielen der von mir verwendeten Datenbanken meine eigene CLR CONCATENATE-Aggregatfunktion, sodass der folgende Code davon abhängt, dass so etwas vorhanden ist. Die obigen SQL-Anweisungen reduzieren sich auf ein viel wartbareres:
Es gibt viele Verkettungsaggregate , wenn Ihre Umgebung CLR-basierte Funktionen zulässt.
quelle
Für eindeutige Spalten pro Index:
quelle
Hier ist der beste Weg, dies zu tun:
Ich bevorzuge die Verwendung impliziter Verknüpfungen, da ich diese viel einfacher verstehen kann. Sie können die object_id-Referenz entfernen, da Sie sie möglicherweise nicht benötigen.
Prost.
quelle
Unter Verwendung von SQL Server 2016 erhalten Sie eine vollständige Liste aller Indizes mit einem enthaltenen Speicherauszug für jede Tabelle, sodass Sie sehen können, wie sich die Tabellen verhalten. Es werden auch Spalten angezeigt, die in abdeckenden Indizes enthalten sind:
quelle
index_column_id
ist nicht die Reihenfolge der Spalten in der PK, sondern in der Tabelle! Verwenden Siekey_ordinal
stattdessen.Ich habe die folgende Abfrage verwendet, als ich diese Anforderung hatte ...
quelle
Arbeitslösung für SQL Server 2014. Ich habe hier nur eine Handvoll Ausgabefelder eingefügt, kann aber beliebig viele hinzufügen.
quelle
index_column_id
ist nicht die Reihenfolge der Spalten in der PK, sondern in der Tabelle! Verwenden Siekey_ordinal
stattdessen.quelle
index_column_id
ist nicht die Reihenfolge der Spalten in der PK, sondern in der Tabelle! Verwenden Siekey_ordinal
stattdessen.