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;

Leave a Reply

Discover more from Blog do Dibiei

Subscribe now to keep reading and get access to the full archive.

Continue reading