Ich möchte die Spalten erhalten, in denen sich ein Index in PostgreSQL befindet.
In MySQL können Sie SHOW INDEXES FOR table
die Column_name
Spalte verwenden und betrachten .
mysql> show indexes from foos;
+-------+------------+---------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-------+------------+---------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| foos | 0 | PRIMARY | 1 | id | A | 19710 | NULL | NULL | | BTREE | |
| foos | 0 | index_foos_on_email | 1 | email | A | 19710 | NULL | NULL | YES | BTREE | |
| foos | 1 | index_foos_on_name | 1 | name | A | 19710 | NULL | NULL | | BTREE | |
+-------+------------+---------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
Gibt es so etwas für PostgreSQL?
Ich habe es \d
an der psql
Eingabeaufforderung versucht (mit der -E
Option, SQL anzuzeigen), aber es werden nicht die Informationen angezeigt, nach denen ich suche.
Update: Vielen Dank an alle, die ihre Antworten hinzugefügt haben. Cope360 gab mir genau das, wonach ich suchte, aber mehrere Leute mischten sich mit sehr nützlichen Links ein. Weitere Informationen finden Sie in der Dokumentation zu pg_index (über Milen A. Radev ) und im sehr nützlichen Artikel Extrahieren von META-Informationen aus PostgreSQL (über Michał Niklas ).
sql
postgresql
indexing
Luke Francl
quelle
quelle
Antworten:
Erstellen Sie einige Testdaten ...
Indizes und indizierte Spalten auflisten:
Rollen Sie die Spaltennamen auf:
quelle
and t.relname like 'test%'
Zeile in die gewünschte (n) Tabelle (n) oder löschen Sie diese Zeile vollständig, um alle Indizes in Ihrer Datenbank zu finden.relkind='r'
bedeutet?r = ordinary table, i = index, S = sequence, v = view, c = composite type, t = TOAST table
.ix.indisunique
PostgreSQL ( pg_indexes ):
MySQL ( SHOW INDEX ):
quelle
SELECT COUNT(indexname) AS indexcount FROM pg_indexes WHERE tablename='mytablename' AND indexdef LIKE '%mycolumnname%' ;
und überprüfenindexcount>0
. mySQL:SHOW INDEX FROM mytablename WHERE Column_name='mycolumnname' ;
und überprüfen Sie, ob die Ergebnismenge nicht leer ist.pg_indexes
Ansicht keine Spaltennamen enthält. postgresql.org/docs/current/view-pg-indexes.html\d table_name
zeigt diese Informationen aus anpsql
. Wenn Sie diese Informationen jedoch mithilfe von SQL aus der Datenbank abrufen möchten, lesen Sie Extrahieren von META-Informationen aus PostgreSQL .Ich verwende solche Informationen in meinem Dienstprogramm, um einige Informationen aus dem Datenbankschema zu melden und PostgreSQL-Datenbanken in Test- und Produktionsumgebungen zu vergleichen.
quelle
\d table
zeige keine Indizes an, jedoch\di
alle Indizes.\t
). Wenn "nur Tupel" aktiviert ist, erhalte ich keine Indizes\d
, wenn "nur Tupel" deaktiviert sind. Dies ist mit psql (PostgreSQL) 9.6.15.Mach einfach:
\d table_name
Aber ich bin mir nicht sicher, was Sie damit meinen, dass die Informationen über Spalten nicht vorhanden sind.
Beispielsweise:
Es wird deutlich, welche Spalten mit dem angegebenen Index in dieser Tabelle enthalten sind.
quelle
\d index_name
haben die Informationen. So kann ich die Indizes einer Tabelle nachschlagen und dann die Details nachschlagen. Wenn ich die Spalten nicht zeige, meine ich, dass ich\d table
mir die durch den Namen generierte SQL angesehen habe und mir nicht klar ist, woher die Spaltenliste stammt. Ich denke, es wird aus der Indexdefinition heraus analysiert, was ich lieber nicht tun würde.\d table
zeige keine Indizes an, jedoch\di
alle Indizes.# \di
Der einfachste und kürzeste Weg ist
\di
, alle Indizes in der aktuellen Datenbank aufzulisten .\di
ist der „kleine Bruder“ des\d
Befehls , der alle Beziehungen der aktuellen Liste wird d ATENBANK. So\di
stehen sicherlich für „Zeigen Sie mir dieses d ATENBANKEN i ndexes“.Typing
\diS
listet alle Indizes system verwendet, das heißt , Sie alle die pg_catalog Indizes sowie bekommen.Mit diesen beiden Befehlen können Sie ein Nachher hinzufügen
+
, um noch mehr Informationen wie die Größe des vom Index benötigten Speicherplatzes und eine Beschreibung, falls verfügbar, zu erhalten.In psql finden Sie leicht Hilfe zur Eingabe von Befehlen
\?
.quelle
Kombiniert mit anderem Code und erstellt eine Ansicht:
quelle
Einige Beispieldaten ...
Verwendung
pg_get_indexdef
Funktion:quelle
Dieser Befehl zeigt auch die Ansicht von Tabellenvariablen, Indizes und Einschränkungen
Beispiel:
quelle
\d tablename
zeigt die Spaltennamen für mich in Version 8.3.8.quelle
ERGEBNIS DER ABFRAGE:
ABFRAGE:
quelle
Die Rohdaten befinden sich in pg_index .
quelle
indkey
: "Dies ist ein Array von Indnatts-Werten, die angeben, welche Tabellenspalten dieser Index indiziert. Beispielsweise würde ein Wert von 1 3 bedeuten, dass die erste und die dritte Tabellenspalte den Indexschlüssel bilden. Eine Null in diesem Array gibt an, dass die Das entsprechende Indexattribut ist ein Ausdruck über den Tabellenspalten und keine einfache Spaltenreferenz. "Wenn Sie die Spaltenreihenfolge im Index beibehalten möchten, haben Sie folgende (sehr hässliche) Möglichkeit:
Die Spaltenreihenfolge wird in der Spalte pg_index.indkey gespeichert, daher habe ich nach den Indizes dieses Arrays sortiert.
quelle
Beim Herumspielen mit Indizes ist die Reihenfolge, in der Spalten im Index erstellt werden, genauso wichtig wie die Spalten selbst.
In der folgenden Abfrage werden alle Indizes für eine bestimmte Tabelle und alle ihre Spalten sortiert aufgelistet.
quelle
i
für die Ordinalität ist sehr glatt. Es stellt sicher, dass die Spalten in der richtigen Reihenfolge angegeben sind.Bitte versuchen Sie die folgende Abfrage, um einen Drilldown zu den erforderlichen Indizes durchzuführen
quelle
quelle
Hier ist eine Funktion , die die Antwort von Bewältigung 360 umschließt:
Verwendung:
quelle
Wie wäre es mit einer einfachen Lösung:
`
quelle
'^[^\)]*\(([^\)]*)\).*$'
Die hervorragende Antwort von @cope360, konvertiert in die Join-Syntax.
quelle
Ich glaube, diese Version existiert noch nicht in diesem Thread: Sie enthält sowohl die Liste der Spaltennamen als auch die ddl für den Index.
Ich habe festgestellt, dass Indizes, die Funktionen verwenden, nicht mit Spaltennamen verknüpft sind. Daher finden Sie gelegentlich eine Indexliste, z. B. einen Spaltennamen, wenn tatsächlich 3 verwendet wird.
Beispiel:
Die Abfrage gibt nur 'col3' als Spalte im Index zurück, aber die DDL zeigt den vollständigen Satz der im Index verwendeten Spalten an.
quelle
Erweitern Sie auf gute Antwort von @ Cope360. Um für eine bestimmte Tabelle zu erhalten (falls sie denselben Tabellennamen, aber ein anderes Schema hat), verwenden Sie einfach die Tabellen-OID.
Erklären Sie: Ich habe den Tabellennamen 'tbassettype' sowohl im Schema 'dbAsset' als auch in 'dbLegal'. Um nur eine Tabelle auf dbLegal zu erhalten, lassen Sie einfach a.attrelid = seine OID.
quelle
Eine etwas modifizierte Antwort von @ Cope360:
Dadurch werden die Indexspalten in der richtigen Reihenfolge angezeigt:
quelle
quelle
Die akzeptierte Antwort von @cope360 ist gut, aber ich wollte etwas mehr wie DBA_IND_COLUMNS, ALL_IND_COLUMNS und USER_IND_COLUMNS von Oracle (z. B. gibt das Tabellen- / Indexschema und die Position des Index in einem mehrspaltigen Index an), daher habe ich den akzeptierten angepasst antworte darauf:
Dies ergibt eine Ausgabe wie:
quelle