Я хотел бы получить столбцы, по которым включен индекс в 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 (через Михала Никласа ).
sql
postgresql
indexing
Люк Франкл
источник
источник
Ответы:
Создать тестовые данные ...
Перечислите индексированные индексы и столбцы:
Сверните названия столбцов:
источник
and t.relname like 'test%'
строку на таблицы, которые вы хотите, или полностью удалите эту строку, чтобы найти все индексы в вашей базе данных.relkind='r'
значит?r = ordinary table, i = index, S = sequence, v = view, c = composite type, t = TOAST table
.ix.indisunique
PostgreSQL ( pg_indexes ):
MySQL ( ПОКАЗАТЬ ИНДЕКС ):
источник
SELECT COUNT(indexname) AS indexcount FROM pg_indexes WHERE tablename='mytablename' AND indexdef LIKE '%mycolumnname%' ;
и проверьтеindexcount>0
. MySQL:SHOW INDEX FROM mytablename WHERE Column_name='mycolumnname' ;
и проверить набор результатов не пустой.pg_indexes
представление не содержит имен столбцов. postgresql.org/docs/current/view-pg-indexes.html\d table_name
показывает эту информацию изpsql
, но если вы хотите получить такую информацию из базы данных, используя SQL, посмотрите на Извлечение информации META из PostgreSQL .Я использую такую информацию в своей утилите, чтобы сообщить некоторую информацию из схемы БД для сравнения баз данных PostgreSQL в тестовой и производственной средах.
источник
\d table
не показывает никаких индексов, однако\di
показывает все индексы.\t
). При включенном «только кортежи» я не получаю индексы\d
, при отключенном «только кортежи» я получаю. Это с psql (PostgreSQL) 9.6.15.Просто сделать:
\d table_name
Но я не уверен, что вы имеете в виду, что информации о столбцах нет.
Например:
Это ясно показывает, какие столбцы данного индекса находятся в этой таблице.
источник
\d index_name
вас есть информация. Так что я могу посмотреть на индексы в таблице, а затем посмотреть детали. Не показывая столбцы, я имею в виду, что я посмотрел на SQL, сгенерированный по\d table
имени, и для меня не очевидно, откуда берется список столбцов. Я думаю, что это анализируется из определения индекса, что я предпочел бы не делать.\d table
не показывает никаких индексов, однако\di
показывает все индексы.# \di
Самый простой и краткий способ -
\di
перечислить все индексы в текущей базе данных.\di
это «младший брат» из\d
команды , которая перечислит все отношения текущего г atabase. Таким образом ,\di
конечно , стоять на «показать мне это d atabases I ndexes».При наборе
\diS
будут перечислены все индексы, используемые в системе, что означает, что вы также получите все индексы pg_catalog.Обе эти команды вы можете добавить
+
после, чтобы получить еще больше информации, такой как размер дискового пространства, необходимого для индекса, и описание, если оно доступно.В psql вы можете легко найти справку о наборе команд
\?
.источник
В сочетании с другим кодом и создал вид:
источник
Некоторые примеры данных ...
Используйте
pg_get_indexdef
функцию:источник
Эта команда также показывает представление переменных, индексов и ограничений таблиц
Пример:
источник
\d tablename
показывает имена столбцов для меня в версии 8.3.8.источник
РЕЗУЛЬТАТ ЗАПРОСА:
QUERY:
источник
Необработанная информация находится в pg_index .
источник
indkey
: «Это массив значений indnatts, которые указывают, какие столбцы таблицы этот индекс индексирует. Например, значение 1 3 будет означать, что первый и третий столбцы таблицы составляют ключ индекса. Ноль в этом массиве указывает, что соответствующий атрибут индекса является выражением над столбцами таблицы, а не простой ссылкой на столбец "Если вы хотите сохранить порядок столбцов в индексе, вот (очень уродливый) способ сделать это:
порядок столбцов хранится в столбце pg_index.indkey, поэтому я упорядочил подписчики из этого массива.
источник
При игре с индексами порядок составления столбцов в индексе так же важен, как и сами столбцы.
Следующий запрос перечисляет все индексы для данной таблицы и все их столбцы в отсортированном виде.
источник
i
для ordinality очень скользким. Это гарантирует, что столбцы указаны в правильном порядке.Пожалуйста, попробуйте запрос ниже, чтобы перейти к нужным индексам
источник
источник
Вот функция, которая оборачивает ответ cope360:
Использование:
источник
Как насчет простого решения:
`
источник
'^[^\)]*\(([^\)]*)\).*$'
Отличный ответ @ cope360, преобразованный для использования синтаксиса соединения.
источник
Я не думаю, что эта версия еще существует в этом потоке: она предоставляет как список имен столбцов, так и ddl для индекса.
Я обнаружил, что индексы, использующие функции, не связываются с именами столбцов, поэтому иногда вы видите список индексов, например, одно имя столбца, когда на самом деле используется 3.
Пример:
Запрос возвращает только «col3» в качестве столбца в индексе, но DDL показывает полный набор столбцов, используемых в индексе.
источник
Продлите до хорошего ответа @ Cope360. Чтобы получить для определенной таблицы (в том случае, если это то же имя таблицы, но разные схемы), просто используя таблицу OID.
Объясните: у меня есть имя таблицы 'tbassettype' в обеих схемах 'dbAsset' и 'dbLegal'. Чтобы получить только таблицу на dbLegal, просто позвольте a.attrelid = его OID.
источник
Немного модифицированный ответ @ cope360:
Это покажет столбцы индекса в правильном порядке:
источник
источник
Принятый ответ @ cope360 хорош, но я хотел что-то более похожее на Oracle DBA_IND_COLUMNS, ALL_IND_COLUMNS и USER_IND_COLUMNS (например, сообщает схему таблицы / индекса и положение индекса в многоколоночном индексе), поэтому я адаптировал принятый ответь на это:
Это дает вывод как:
источник