Список столбцов с индексами в PostgreSQL - PullRequest
203 голосов
/ 05 февраля 2010

Я хотел бы получить столбцы, к которым относится индекс в PostgreSQL.

В MySQL вы можете использовать SHOW INDEXES FOR table и посмотреть на столбец Column_name.

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      |         | 
+-------+------------+---------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+

Существует ли что-нибудь подобное для PostgreSQL?

Я пытался \d в командной строке psql (с параметром -E для отображения SQL), но он не отображает информацию, которую я ищу.

Обновление: Спасибо всем, кто добавил свои ответы. cope360 дал мне именно то, что я искал, но несколько человек вмешались с очень полезными ссылками. Для дальнейшего ознакомления, ознакомьтесь с документацией для pg_index (через Милен А. Радев ) и очень полезной статьей Извлечение информации META из PostgreSQL (через Михал Никлас ).

Ответы [ 23 ]

0 голосов
/ 10 декабря 2015

Как насчет простого решения:

SELECT 
  t.relname table_name,
  ix.relname index_name,
  indisunique,
  indisprimary, 
  regexp_replace(pg_get_indexdef(indexrelid), '.*\((.*)\)', '\1') columns
FROM pg_index i
JOIN pg_class t ON t.oid = i.indrelid
JOIN pg_class ix ON ix.oid = i.indexrelid
WHERE t.relname LIKE 'test%'

`

0 голосов
/ 02 февраля 2017

Я не думаю, что эта версия еще существует в этом потоке: она предоставляет как список имен столбцов, так и ddl для индекса.

CREATE OR REPLACE VIEW V_TABLE_INDEXES AS

SELECT
     n.nspname  as "schema"
    ,t.relname  as "table"
    ,c.relname  as "index"
    ,i.indisunique AS "is_unique"
    ,array_to_string(array_agg(a.attname), ', ') as "columns"
    ,pg_get_indexdef(i.indexrelid) as "ddl"
FROM pg_catalog.pg_class c
    JOIN pg_catalog.pg_namespace n ON n.oid        = c.relnamespace
    JOIN pg_catalog.pg_index i ON i.indexrelid = c.oid
    JOIN pg_catalog.pg_class t ON i.indrelid   = t.oid
    JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(i.indkey)
WHERE c.relkind = 'i'
      and n.nspname not in ('pg_catalog', 'pg_toast')
      and pg_catalog.pg_table_is_visible(c.oid)
GROUP BY
    n.nspname
    ,t.relname
    ,c.relname
    ,i.indisunique
    ,i.indexrelid
ORDER BY
    n.nspname
    ,t.relname
    ,c.relname;

Я обнаружил, что индексы, использующие функции, не связываются с именами столбцов, поэтому иногда вы видите список индексов, например. имя одного столбца, если на самом деле используется 3.

Пример:

CREATE INDEX ui1 ON table1 (coalesce(col1,''),coalesce(col2,''),col3)

Запрос возвращает только 'col3' в качестве столбца индекса, но DDL показывает полный набор столбцов, используемых в индексе.

0 голосов
/ 11 ноября 2016
Превосходный ответ

@ cope360, преобразованный в синтаксис соединения.

select t.relname as table_name
     , i.relname as index_name
     , array_to_string(array_agg(a.attname), ', ') as column_names
from pg_class t
join pg_index ix
on t.oid = ix.indrelid
join pg_class i
on i.oid = ix.indexrelid
join pg_attribute a
on a.attrelid = t.oid
and a.attnum = ANY(ix.indkey)
where t.relkind = 'r'
and t.relname like 'test%'
group by t.relname
       , i.relname
order by t.relname
       , i.relname
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...