Gostaria de obter as colunas em que um índice está no PostgreSQL.
No MySQL você pode usar SHOW INDEXES FOR table
e olhar para a Column_name
coluna.
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 assim para o PostgreSQL?
Eu tentei \d
no psql
prompt de comando (com a -E
opção de mostrar SQL), mas ele não mostra as informações que estou procurando.
Atualização: obrigado a todos que adicionaram suas respostas. cope360 me deu exatamente o que eu estava procurando, mas várias pessoas entraram em contato com links muito úteis. Para referência futura, consulte a documentação do pg_index (via Milen A. Radev ) e o artigo muito útil Extraindo informações META do PostgreSQL (via Michał Niklas ).
sql
postgresql
indexing
Luke Francl
fonte
fonte
Respostas:
Crie alguns dados de teste ...
Listar índices e colunas indexados:
Enrole os nomes das colunas:
fonte
and t.relname like 'test%'
linha para a (s) tabela (s) desejada (s) ou apague essa linha completamente para encontrar todos os índices em seu banco de dados.relkind='r'
significa?r = ordinary table, i = index, S = sequence, v = view, c = composite type, t = TOAST table
.ix.indisunique
PostgreSQL ( pg_indexes ):
MySQL ( SHOW INDEX ):
fonte
SELECT COUNT(indexname) AS indexcount FROM pg_indexes WHERE tablename='mytablename' AND indexdef LIKE '%mycolumnname%' ;
e verifiqueindexcount>0
. mySQL:SHOW INDEX FROM mytablename WHERE Column_name='mycolumnname' ;
e verifique se o conjunto de resultados não está vazio.pg_indexes
exibição não fornece nomes de colunas. postgresql.org/docs/current/view-pg-indexes.html\d table_name
mostra essas informaçõespsql
, mas se você deseja obter essas informações do banco de dados usando SQL, consulte Extrair informações do META do PostgreSQL .Uso essas informações no meu utilitário para relatar algumas informações do esquema db para comparar os bancos de dados do PostgreSQL em ambientes de teste e produção.
fonte
\d table
não mostra nenhum índice; no entanto\di
, mostra todos os índices.\t
). Com "somente tuplas" ativada, não recebo índices de\d
, com "somente tuplas" desativadas. Isso ocorre com o psql (PostgreSQL) 9.6.15.Apenas faça:
\d table_name
Mas não sei ao que você quer dizer que as informações sobre colunas não estão lá.
Por exemplo:
Ele mostra claramente quais colunas cujo índice está nesta tabela.
fonte
\d index_name
tem as informações. Para procurar os índices em uma tabela e depois os detalhes. Ao não mostrar as colunas, quero dizer que examinei o SQL gerado pelo\d table
nome e não é óbvio para mim de onde vem a lista de colunas. Eu acho que está sendo analisado fora da definição do índice, o que eu preferiria não fazer.\d table
não mostra nenhum índice; no entanto\di
, mostra todos os índices.# \di
A maneira mais fácil e rápida é
\di
, que listará todos os índices no banco de dados atual.\di
é o "irmão pequeno" do\d
comando que irá listar todas as relações do atual d atabase. Assim\di
, certamente, representam "me mostrar esta d atabases i ndexes".A digitação
\diS
listará todos os índices usados em todo o sistema, o que significa que você obtém todos os índices pg_catalog também.Com esses dois comandos, você pode adicionar um
+
depois para obter ainda mais informações, como o tamanho do espaço em disco que o índice precisa e uma descrição, se disponível.No psql, você pode facilmente encontrar ajuda sobre a digitação de comandos
\?
.fonte
Combinado com outro código e criou uma visualização:
fonte
Alguns dados de amostra ...
Use a
pg_get_indexdef
função:fonte
Este comando mostra a visualização de tabelas variáveis, índices e restrições também
Exemplo:
fonte
\d tablename
mostra os nomes das colunas para mim na versão 8.3.8.fonte
RESULTADO DA CONSULTA:
INQUERIR:
fonte
As informações brutas estão em pg_index .
fonte
indkey
: "Esta é uma matriz de valores indnatts que indicam quais colunas da tabela esse índice indexa. Por exemplo, um valor 1 3 significaria que a primeira e a terceira colunas da tabela compõem a chave de índice. Um zero nessa matriz indica que o valor atributo de índice correspondente é uma expressão sobre as colunas da tabela, em vez de uma simples referência de coluna "Se você deseja preservar a ordem das colunas no índice, aqui está uma maneira (muito feia) de fazer isso:
a ordem das colunas é armazenada na coluna pg_index.indkey, então eu ordenei pelos subscritos dessa matriz.
fonte
Ao brincar com índices, a ordem de quais colunas são construídas no índice é tão importante quanto as próprias colunas.
A consulta a seguir lista todos os índices para uma determinada tabela e todas as suas colunas de maneira classificada.
fonte
i
para a ordinalidade é muito liso. Ele garante que as colunas sejam declaradas na ordem correta.Tente a consulta abaixo para detalhar os índices necessários
fonte
fonte
Aqui está uma função que envolve a resposta do cope360:
Uso:
fonte
Que tal uma solução simples:
`
fonte
'^[^\)]*\(([^\)]*)\).*$'
A excelente resposta de @ cope360, convertida para usar a sintaxe de junção.
fonte
Acho que essa versão ainda não existe neste segmento: fornece a lista de nomes de colunas e o ddl para o índice.
Descobri que índices usando funções não vinculam a nomes de colunas; portanto, ocasionalmente, você encontra uma listagem de índices, por exemplo, um nome de coluna quando na verdade usa 3.
Exemplo:
A consulta retorna apenas 'col3' como uma coluna no índice, mas o DDL mostra o conjunto completo de colunas usadas no índice.
fonte
Estenda a boa resposta de @ Cope360. Para obter uma determinada tabela (coloque o mesmo nome da tabela, mas esquema diferente), basta usar a tabela OID.
Explique: Eu tenho o nome da tabela 'tbassettype' no esquema 'dbAsset' e 'dbLegal'. Para obter apenas uma tabela no dbLegal, deixe a.attrelid = seu OID.
fonte
Uma resposta um pouco modificada de @ cope360:
Isso mostrará as colunas do índice na ordem correta:
fonte
fonte
A resposta aceita por @ cope360 é boa, mas eu queria algo um pouco mais como DBA_IND_COLUMNS da Oracle, ALL_IND_COLUMNS e USER_IND_COLUMNS (por exemplo, relata o esquema de tabela / índice e a posição do índice em um índice de várias colunas), então adaptei o responda a isso:
Isso fornece uma saída como:
fonte