Capítulo 8. Índices

Índice
8.1. Introdução
8.2. Tipos de índice
8.3. Índices com várias colunas
8.4. Índices únicos
8.5. Índices funcionais
8.6. Classes de operador
8.7. Índices parciais
8.8. Examinando a utilização do índice

Habitualmente, os índices são utilizados para melhorar o desempenho dos bancos de dados. Um índice permite ao servidor de banco de dados encontrar e trazer linhas específicas muito mais rápido do que faria sem o índice. Mas os índices também produzem trabalho adicional para o sistema de banco de dados como um todo devendo, portanto, serem utilizados conscientemente.

8.1. Introdução

O exemplo clássico da necessidade de um índice é a existência de uma tabela semelhante a esta:

CREATE TABLE teste1 (
    id integer,
    conteudo varchar
);

com a aplicação executando muitas consultas da forma:

SELECT conteudo FROM teste1 WHERE id = constante;

Normalmente, o sistema seria obrigado a percorrer a tabela teste1, linha por linha, para encontrar todas as entradas correspondentes. Se existirem muitas linhas em teste1, e somente poucas linhas (possivelmente uma ou nenhuma) retornadas pela consulta, então este método é claramente ineficiente. Se o sistema fosse instruído para manter um índice para a coluna id, então poderia ser utilizado um método mais eficiente para localizar as linhas correspondentes. Por exemplo, só precisaria percorrer uns poucos níveis dentro da árvore de procura.

Uma abordagem semelhante é utilizada pela maioria dos livros, fora os de ficção: Os termos e os conceitos procurados freqüentemente pelos leitores são reunidos em um índice alfabético colocado no final do livro. O leitor interessado pode percorrer o índice rapidamente e ir direto para a página desejada, sem ter que ler o livro por inteiro em busca do local onde está interessado. Assim como é uma tarefa do autor prever os itens que os leitores mais provavelmente vão procurar, é uma tarefa do programador de banco de dados prever quais índices trarão benefícios.

O comando mostrado abaixo pode ser utilizado para criar o índice na coluna id conforme foi discutido:

CREATE INDEX idx_teste1_id ON teste1 (id);

O nome idx_teste1_id pode ser escolhido livremente, mas deve ser usado algo que permita lembrar mais tarde para que serve o índice.

Para remover um índice é utilizado o comando DROP INDEX. Os índices podem ser adicionados ou removidos das tabelas a qualquer instante.

Após o índice ser criado não é necessária mais nenhuma intervenção adicional: o sistema passa a utilizar o índice quando julgar mais eficiente do que a procura seqüencial na tabela. Porém, é necessário executar o comando ANALYZE regularmente para atualizar as estatísticas que permitem ao planejador de consultas tomar melhores decisões. Também deve ser lido o Capítulo 10 para obter informações sobre como descobrir se o índice está sendo utilizado, e quando e porque o planejador pode decidir não utilizar um índice.

Os índices podem beneficiar as atualizações (UPDATE) e as exclusões (DELETE) com condição de procura. Os índices também podem ser utilizados em consultas com junção. Portanto, um índice definido em uma coluna que faça parte da condição de junção pode acelerar, significativamente, a consulta.

Quando um índice é criado, o sistema precisa mantê-lo sincronizado com a tabela. Isto gera um trabalho adicional para as operações de manipulação de dados. Portanto, os índices não essenciais ou não utilizados devem ser removidos. Observe que uma consulta ou um comando de manipulação de dados pode utilizar no máximo um índice por tabela.