Me gustaría obtener las columnas en las que se encuentra un índice en PostgreSQL.
En MySQL puede usar SHOW INDEXES FOR table
y mirar la Column_name
columna.
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 algo como esto para PostgreSQL?
He intentado \d
en el psql
símbolo del sistema (con la -E
opción de mostrar SQL) pero no muestra la información que estoy buscando.
Actualización: Gracias a todos los que agregaron sus respuestas. cope360 me dio exactamente lo que estaba buscando, pero varias personas intervinieron con enlaces muy útiles. Para referencia futura, consulte la documentación de pg_index (a través de Milen A. Radev ) y el muy útil artículo Extracción de información META de PostgreSQL (a través de Michał Niklas ).
sql
postgresql
indexing
Luke Francl
fuente
fuente
Respuestas:
Crea algunos datos de prueba ...
Lista de índices y columnas indexadas:
Enrollar los nombres de columna:
fuente
and t.relname like 'test%'
línea a la (s) tabla (s) que desee o borre esa línea por completo para encontrar todos los índices en su base de datos.relkind='r'
significa?r = ordinary table, i = index, S = sequence, v = view, c = composite type, t = TOAST table
.ix.indisunique
PostgreSQL ( pg_indexes ):
MySQL ( MOSTRAR ÍNDICE ):
fuente
SELECT COUNT(indexname) AS indexcount FROM pg_indexes WHERE tablename='mytablename' AND indexdef LIKE '%mycolumnname%' ;
y verificarindexcount>0
. mySQL:SHOW INDEX FROM mytablename WHERE Column_name='mycolumnname' ;
y verifique que el conjunto de resultados no esté vacío.pg_indexes
vista no proporciona nombres de columna. postgresql.org/docs/current/view-pg-indexes.html\d table_name
muestra esta informaciónpsql
, pero si desea obtener dicha información de la base de datos utilizando SQL, eche un vistazo a Extracción de información META de PostgreSQL .Utilizo dicha información en mi utilidad para informar cierta información del esquema db para comparar bases de datos PostgreSQL en entornos de prueba y producción.
fuente
\d table
no muestra ningún índice, sin embargo\di
, muestra todos los índices.\t
). Con "solo\d
tuplas" activado, no obtengo índices , con "solo tuplas" desactivado, sí. Esto es con psql (PostgreSQL) 9.6.15.Solo haz:
\d table_name
Pero no estoy seguro de qué quiere decir que la información sobre las columnas no está allí.
Por ejemplo:
Muestra claramente qué columnas da el índice está en esta tabla.
fuente
\d index_name
tiene la información. Entonces puedo buscar los índices en una tabla y luego buscar los detalles. Al no mostrar las columnas quiero decir que miré el SQL generado por\d table
nombre y no es obvio para mí de dónde proviene la lista de columnas. Creo que se está analizando a partir de la definición del índice, que preferiría no hacer.\d table
no muestra ningún índice, sin embargo\di
, muestra todos los índices.# \di
La forma más fácil y más corta es
\di
, que enumerará todos los índices en la base de datos actual.\di
es el "hermano pequeño" del\d
comando que enumerará todas las relaciones de la corriente d atabase. Por lo tanto\di
, sin duda significar "a mostrar este d atabases i ndexes".Al escribir,
\diS
se enumerarán todos los índices utilizados en todo el sistema, lo que significa que también obtendrá todos los índices pg_catalog.Con estos dos comandos, puede agregar un
+
después para obtener aún más información, como el tamaño del espacio en disco que necesita el índice y una descripción si está disponible.En psql puede encontrar fácilmente ayuda sobre la escritura de comandos
\?
.fuente
En combinación con el código de otros y creó una vista:
fuente
Algunos datos de muestra ...
Utilizar la
pg_get_indexdef
función:fuente
Este comando también muestra la vista de las variables, índices y restricciones de las tablas.
Ejemplo:
fuente
\d tablename
me muestra los nombres de columna en la versión 8.3.8.fuente
RESULTADO DE LA CONSULTA:
CONSULTA:
fuente
La información en bruto está en pg_index .
fuente
indkey
: "Esta es una matriz de valores indnatts que indican qué columnas de la tabla indexa este índice. Por ejemplo, un valor de 1 3 significaría que la primera y la tercera columna de la tabla constituyen la clave del índice. Un cero en esta matriz indica que El atributo de índice correspondiente es una expresión sobre las columnas de la tabla, en lugar de una simple referencia de columna "Si desea preservar el orden de las columnas en el índice, aquí hay una forma (muy fea) de hacerlo:
El orden de las columnas se almacena en la columna pg_index.indkey, por lo que ordené por los subíndices de esa matriz.
fuente
Cuando se juega con índices, el orden de las columnas que se construyen en el índice es tan importante como las columnas mismas.
La siguiente consulta enumera todos los índices de una tabla determinada y todas sus columnas de forma ordenada.
fuente
i
para la ordinalidad es muy hábil. Asegura que las columnas se indiquen en el orden correcto.Intente la consulta a continuación para profundizar en los índices necesarios
fuente
fuente
Aquí hay una función que envuelve la respuesta de cope360:
Uso:
fuente
¿Qué tal una solución simple:
``
fuente
'^[^\)]*\(([^\)]*)\).*$'
La excelente respuesta de @ cope360, convertida para usar la sintaxis de unión.
fuente
Todavía no creo que esta versión exista en este hilo: proporciona la lista de nombres de columna junto con el ddl para el índice.
Descubrí que los índices que usan funciones no se vinculan con los nombres de las columnas, por lo que ocasionalmente puede encontrar una lista de índices, por ejemplo, un nombre de columna cuando en realidad se usa 3.
Ejemplo:
La consulta solo devuelve 'col3' como una columna en el índice, pero el DDL muestra el conjunto completo de columnas utilizadas en el índice.
fuente
Extienda a la buena respuesta de @ Cope360. Para obtener cierta tabla (en caso de que sea el mismo nombre de tabla pero diferente esquema), solo use el OID de la tabla.
Explique: Tengo el nombre de tabla 'tbassettype' en el esquema 'dbAsset' y 'dbLegal'. Para obtener solo la tabla en dbLegal, simplemente deje que a.attrelid = su OID.
fuente
Una respuesta un poco modificada de @ cope360:
Esto mostrará las columnas de índice en el orden correcto:
fuente
fuente
La respuesta aceptada por @ cope360 es buena, pero quería algo un poco más como DBA_IND_COLUMNS, ALL_IND_COLUMNS de Oracle y USER_IND_COLUMNS (por ejemplo, informa el esquema de tabla / índice y la posición del índice en un índice de varias columnas), así que adapté el aceptado responde a esto:
Esto da una salida como:
fuente