Essa é uma dica rápida que pode ser útil durante a análise de um plano de execução de um comando SQL, onde geralmente precisamos identificar quais colunas são usadas por determinado índice.
A query abaixo lista todos os índices de uma tabela, um índice por linha, e retorna todos as colunas do índice separadas por vírgula, na mesma ordem que foi usada na criação do índice.
SET LIN 1000
COL INDEX_NAME FORMAT A30
COL COLUNAS FORMAT A100
SELECT index_name, LISTAGG(column_name, ', ') WITHIN GROUP (ORDER BY column_position) AS COLUNAS
FROM dba_ind_columns
WHERE table_name='&TABELA'
GROUP BY index_name;
Exemplo consultando a tabela USER$:
SQL> SET LIN 1000
COL INDEX_NAME FORMAT A30
COL COLUNAS FORMAT A100
SELECT index_name, LISTAGG(column_name, ', ') WITHIN GROUP (ORDER BY column_position) AS COLUNAS
FROM dba_ind_columns
WHERE table_name='USER$'
GROUP BY index_name;
INDEX_NAME COLUNAS
------------------------------ ----------------------------------------------------------------------------------------------------
I_USER1 NAME
I_USER2 USER#, TYPE#, SPARE1, SPARE2
SQL>
A query acima não tem o filtro do OWNER da tabela para facilitar o uso no dia a dia, mas eventualmente poderia ser necessário incluir esse filtro, caso o banco tenha duas tabelas com o mesmo nome, em schemas diferentes.
Exemplo filtrando a tabela e o owner:
SET LIN 1000
COL INDEX_NAME FORMAT A30
COL COLUNAS FORMAT A100
SELECT index_name, LISTAGG(column_name, ', ') WITHIN GROUP (ORDER BY column_position) AS COLUNAS
FROM dba_ind_columns
WHERE table_name='USER$'
AND table_owner='SYS'
GROUP BY index_name;