Je voudrais obtenir les colonnes sur lesquelles se trouve un index dans PostgreSQL.
Dans MySQL, vous pouvez utiliser SHOW INDEXES FOR table
et consulter la Column_name
colonne.
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 | |
+-------+------------+---------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
Existe-t-il quelque chose comme ça pour PostgreSQL?
J'ai essayé \d
à l' psql
invite de commande (avec l' -E
option d'afficher SQL) mais il n'affiche pas les informations que je recherche.
Mise à jour: Merci à tous ceux qui ont ajouté leurs réponses. cope360 m'a donné exactement ce que je cherchais, mais plusieurs personnes sont intervenues avec des liens très utiles. Pour référence future, consultez la documentation de pg_index (via Milen A. Radev ) et l'article très utile Extraire les informations META de PostgreSQL (via Michał Niklas ).
sql
postgresql
indexing
Luke Francl
la source
la source
Réponses:
Créez des données de test ...
Liste des index et des colonnes indexés:
Roll up les noms des colonnes:
la source
and t.relname like 'test%'
ligne en table (s) que vous voulez, ou effacez complètement cette ligne pour trouver tous les index dans votre base de données.relkind='r'
signifie?r = ordinary table, i = index, S = sequence, v = view, c = composite type, t = TOAST table
.ix.indisunique
PostgreSQL ( pg_indexes ):
MySQL ( MONTRER INDEX ):
la source
SELECT COUNT(indexname) AS indexcount FROM pg_indexes WHERE tablename='mytablename' AND indexdef LIKE '%mycolumnname%' ;
et vérifiezindexcount>0
. mySQL:SHOW INDEX FROM mytablename WHERE Column_name='mycolumnname' ;
et vérifiez que le jeu de résultats n'est pas vide.pg_indexes
vue ne fournit pas de noms de colonne. postgresql.org/docs/current/view-pg-indexes.html\d table_name
affiche ces informationspsql
, mais si vous souhaitez obtenir ces informations de la base de données en utilisant SQL, jetez un œil à Extraire les informations META de PostgreSQL .J'utilise ces informations dans mon utilitaire pour signaler certaines informations du schéma db afin de comparer les bases de données PostgreSQL dans les environnements de test et de production.
la source
\d table
n'affiche aucun index, mais\di
affiche tous les index.\t
). Avec "tuples only" activé, je n'obtiens pas d'index\d
, avec "tuples only" désactivé, je le fais. C'est avec psql (PostgreSQL) 9.6.15.Faites juste:
\d table_name
Mais je ne sais pas ce que tu veux dire par là que les informations sur les colonnes ne sont pas là.
Par exemple:
Il montre clairement quelles colonnes l'index donné se trouve sur cette table.
la source
\d index_name
a les informations. Je peux donc rechercher les index sur une table, puis rechercher les détails. En ne montrant pas les colonnes, je veux dire que j'ai regardé le SQL généré par\d table
nom et il n'est pas évident pour moi d'où vient la liste des colonnes. Je pense qu'il est analysé hors de la définition de l'indice, ce que je préférerais ne pas faire.\d table
n'affiche aucun index, mais\di
affiche tous les index.# \di
La méthode la plus simple et la plus courte est la
\di
liste de tous les index de la base de données actuelle.\di
est le « petit frère » de la\d
commande qui liste toutes les relations du courant d atabase. Ainsi , une\di
certaine organisation pour « me montrer d atabases i ndexes ».La
\diS
saisie répertorie tous les index utilisés à l'échelle du système, ce qui signifie que vous obtenez également tous les index pg_catalog.Avec ces deux commandes, vous pouvez ajouter un
+
après pour obtenir encore plus d'informations comme la taille de l'espace disque dont l'index a besoin et une description si disponible.Dans psql, vous pouvez facilement trouver de l'aide sur la saisie des commandes
\?
.la source
Combiné avec d'autres codes et créé une vue:
la source
Quelques exemples de données ...
Utiliser la
pg_get_indexdef
fonction:la source
Cette commande affiche également la vue des variables des tables, des index et des contraintes
Exemple:
la source
\d tablename
affiche les noms de colonne pour moi sur la version 8.3.8.la source
RÉSULTAT DE LA DEMANDE:
REQUETE:
la source
Les informations brutes se trouvent dans pg_index .
la source
indkey
: "Il s'agit d'un tableau de valeurs d'indnatts qui indiquent les colonnes de table indexées par cet index. Par exemple, une valeur de 1 3 signifierait que les première et troisième colonnes de table constituent la clé d'index. Un zéro dans ce tableau indique que le l'attribut d'index correspondant est une expression sur les colonnes de la table, plutôt qu'une simple référence de colonne "Si vous souhaitez conserver l'ordre des colonnes dans l'index, voici un moyen (très laid) de le faire:
l'ordre des colonnes est stocké dans la colonne pg_index.indkey, j'ai donc ordonné par les indices de ce tableau.
la source
Lorsque vous jouez avec des index, l'ordre dans lequel les colonnes sont construites dans l'index est aussi important que les colonnes elles-mêmes.
La requête suivante répertorie tous les index d'une table donnée et toutes leurs colonnes de manière triée.
la source
i
ordinalité est très lisse. Il garantit que les colonnes sont indiquées dans le bon ordre.Veuillez essayer la requête ci-dessous pour explorer les index requis
la source
la source
Voici une fonction qui encapsule la réponse de cope360:
Usage:
la source
Que diriez-vous d'une solution simple:
"
la source
'^[^\)]*\(([^\)]*)\).*$'
Excellente réponse de @ cope360, convertie pour utiliser la syntaxe de jointure.
la source
Je ne pense pas que cette version existe encore sur ce fil: elle fournit à la fois la liste des noms de colonnes ainsi que le ddl pour l'index.
J'ai trouvé que les index utilisant des fonctions ne sont pas liés aux noms de colonnes, donc parfois vous trouvez une liste d'index, par exemple un nom de colonne alors qu'en fait, il utilise 3.
Exemple:
La requête renvoie uniquement «col3» en tant que colonne sur l'index, mais la DDL affiche l'ensemble complet des colonnes utilisées dans l'index.
la source
Étendre à la bonne réponse de @ Cope360. Pour obtenir une certaine table (au cas où il s'agit du même nom de table mais d'un schéma différent), il suffit d'utiliser la table OID.
Expliquez: J'ai le nom de table «tbassettype» dans le schéma «dbAsset» et «dbLegal». Pour obtenir uniquement une table sur dbLegal, laissez simplement a.attrelid = son OID.
la source
Une réponse un peu modifiée de @ cope360:
Cela affichera les colonnes d'index dans l'ordre correct:
la source
la source
La réponse acceptée par @ cope360 est bonne, mais je voulais quelque chose d'un peu plus comme DBA_IND_COLUMNS, ALL_IND_COLUMNS et USER_IND_COLUMNS d'Oracle (par exemple, rapporte le schéma de table / index et la position de l'index dans un index multicolonne), j'ai donc adapté l'accepté répondre à ceci:
Cela donne une sortie comme:
la source