8.3. Índices com várias colunas

Um índice pode ser definido envolvendo mais de uma coluna. Por exemplo, se existir uma tabela da forma

CREATE TABLE teste2 (
  maior int,
  menor int,
  nome  varchar
);

(Digamos que seja mantido o diretório /dev no banco de dados...) e seja feita freqüentemente uma consulta do tipo

SELECT nome FROM teste2 WHERE maior = constante AND menor = constante;

então é apropriada a definição de um índice envolvendo as colunas maior e menor. Por exemplo,

CREATE INDEX idx_teste2_maior_menor ON teste2 (maior, menor);

Atualmente, somente as implementações de B-tree e GiST suportam índices com várias colunas. Até 32 colunas podem ser especificadas (Este limite pode ser alterado durante a geração do PostgreSQL; consulte o arquivo pg_config.h).

O otimizador de consultas pode utilizar um índice com várias colunas, para consultas que envolvam as primeiras n colunas consecutivas do índice (quando utilizado com os operadores apropriados, até o número total de colunas especificadas na definição do índice. Por exemplo, um índice incluindo (a, b, c) pode ser utilizado em consultas envolvendo a, b e c, ou em consultas envolvendo a e b, ou em consultas envolvendo apenas a, mas não em outras combinações. (Em uma consulta envolvendo a e c, o otimizador pode decidir utilizar um índice para a apenas, tratando c como uma coluna comum não indexada).

Os índices com várias colunas só podem ser utilizados se as cláusulas envolvendo as colunas indexadas forem unidas por AND. Por exemplo,

SELECT nome FROM teste2 WHERE maior = constante OR menor = constante;

não pode fazer uso do índice idx_teste2_maior_menor definido acima para procurar as duas colunas (Entretanto, pode ser utilizado para procurar a coluna maior apenas).

Os índices com várias colunas devem ser usados com moderação. Na maioria das vezes, um índice em apenas uma coluna é suficiente, economizando espaço e tempo. Um índice com mais de três colunas é quase certo não ser apropriado.