8.2. Tipos de índice

O PostgreSQL disponibiliza vários tipos de índice: B-tree (árvore B), R-tree (árvore R), GiST e Hash. Cada tipo de índice é mais apropriado para um determinado tipo de consulta devido ao algoritmo utilizado. Por padrão, o comando CREATE INDEX cria um índice B-tree, adequado para as situações mais comuns. Em particular, o otimizador de consultas do PostgreSQL levará em consideração utilizar um índice B-tree sempre que uma coluna indexada estiver envolvida numa comparação utilizando um dos seguintes operadores: <, <=, =, >=, >

Os índices R-tree são especialmente indicados para dados espaciais. Para criar um índice R-tree, deve ser utilizado um comando da forma:

CREATE INDEX nome ON tabela USING RTREE (coluna);

O otimizador de consultas do PostgreSQL levará em consideração utilizar um índice R-tree sempre que uma coluna indexada estiver envolvida numa comparação utilizando um dos seguintes operadores: <<, &<, &>, >>, @, ~=, && (Consulte a Seção 6.9 para conhecer o significado destes operadores).

O otimizador de consultas do PostgreSQL levará em consideração utilizar um índice hash sempre que uma coluna indexada estiver envolvida numa comparação utilizando o operador=. O seguinte comando pode ser utilizado para criar um índice hash:

CREATE INDEX nome ON tabela USING HASH (coluna);

Nota: Os testes mostram que os índices hash do PostgreSQL têm desempenho semelhante ou mais lento que os índices B-tree, e que o tamanho e o tempo de construção dos índices hash são muito piores. Os índices hash também possuem um fraco desempenho sob alta concorrência. Por estas razões, a utilização dos índices hash é desestimulada.

O índice B-tree é uma implementação das árvores B de alta concorrência de Lehman-Yao. O método do índice R-tree implementa as árvores R utilizando o algoritmo de partição quadrática de Guttman. O índice hash é uma uma implementação das dispersões lineares de Litwin. São mencionados os algoritmos utilizados somente para indicar que todos estes métodos de acesso são inteiramente dinâmicos, não necessitando de otimização periódica (como no caso de, por exemplo, métodos de acesso hash estáticos).