11.2. Tipos de índice #

11.2.1. B-Tree
11.2.2. Hash
11.2.3. GiST
11.2.4. SP-GiST
11.2.5. GIN
11.2.6. BRIN

Figura 11.1. Tipos de índice


O PostgreSQL disponibiliza vários tipos de índice: B-Tree (Árvore-B), Hash, GiST, SP-GiST, GIN, BRIN, e a extensão bloom. Cada tipo de índice utiliza um algoritmo diferente, mais adequado a diferentes tipos de cláusulas indexáveis. Por padrão, o comando CREATE INDEX Cria índices B-Tree, que se adéquam às situações mais comuns. Os outros tipos de índice são selecionados escrevendo a palavra-chave USING seguida do nome do tipo de índice. Por exemplo, para criar um índice Hash:

CREATE INDEX nome ON tabela USING HASH (coluna);

11.2.1. B-Tree #

Os índices B-Tree podem lidar com consultas de igualdade e de intervalo em dados que podem ser classificados por alguma ordenação. Em particular, o planejador de consultas do PostgreSQL vai considerar o uso de um índice B-Tree sempre que uma coluna indexada estiver envolvida em uma comparação usando um dos seguintes operadores:

<   <=   =   >=   >

As construções equivalentes a combinações destes operadores, tais como BETWEEN e IN, também podem ser implementadas com uma procura por índice B-Tree. Além disso, uma condição IS NULL ou IS NOT NULL em uma coluna indexada também pode ser usada com índice B-Tree.

O otimizador também pode usar um índice B-Tree para consultas envolvendo os operadores de correspondência de padrão LIKE e ~, se o padrão for uma constante e estiver ancorado no início da cadeia de caracteres — por exemplo, col LIKE 'foo%' ou col ~ '^foo', mas não col LIKE '%bar'. No entanto, se o banco de dados não usar a localidade C, será necessário criar o índice com uma classe de operadores especial para dar suporte à indexação de correspondência de padrões; veja Seção 11.10 abaixo. Também é possível usar índices B-Tree para ILIKE e ~*, mas somente se o padrão começar com caracteres não alfabéticos, ou seja, caracteres que não são afetados pela conversão de maiúsculas/minúsculas.

Os índices B-Tree também podem ser usados para recuperar dados em ordem de classificação. Esta forma nem sempre é mais rápida que uma simples varredura e classificação, mas é geralmente útil.

11.2.2. Hash #

Os índices Hash armazenam um código hash de 32 bits derivado do valor da coluna indexada. Portanto, estes índices só podem lidar com comparações de igualdade simples. O planejador de consultas considera o uso de um índice Hash sempre que uma coluna indexada estiver envolvida em uma comparação usando o operador igual:

=

11.2.3. GiST #

Os índices GiST (acrônimo para Generalized Search Tree) não são um único tipo de índice, mas sim uma infraestrutura onde muitas estratégias de indexação diferentes podem ser implementadas. Assim, os operadores específicos com os quais um índice GiST pode ser usado variam dependendo da estratégia de indexação (a classe de operadores). Como exemplo, a distribuição padrão do PostgreSQL inclui classes de operadores GiST para vários tipos de dados geométricos bidimensionais, que suportam consultas indexadas usando os seguintes operadores:

<<   &<   &>   >>   <<|   &<|   |&>   |>>   @>   <@   ~=   &&

(Veja a Seção 9.11 para conhecer o significado destes operadores.) As classes de operadores GiST incluídas na distribuição padrão estão documentadas na Tabela 65.1. Muitas outras classes de operadores GiST estão disponíveis na coleção contrib ou como projetos separados. Para obter mais informações veja a Seção 65.2.

Os índices GiST também são capazes de otimizar pesquisas de vizinho-mais-próximo (nearest-neighbor), como

SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;

que encontra os dez lugares mais próximos de um determinado ponto de destino. A capacidade de fazer isto depende novamente da classe de operador específica que está sendo usada. Na Tabela 65.1, os operadores que podem ser usados desta maneira estão listados na coluna Operadores de ordenação.

11.2.4. SP-GiST #

Os índices SP-GiST, assim como os índices GiST, oferecem uma infraestrutura que dá suporte a vários tipos de procuras. O SP-GiST permite a implementação de uma ampla gama de diferentes estruturas de dados baseadas em disco não balanceadas, como quadtrees, árvores k-d e árvores radix (tentativas). Como exemplo, a distribuição padrão do PostgreSQL inclui classes de operadores SP-GiST para pontos bidimensionais, que suportam consultas indexadas usando os seguintes operadores:

<<   >>   ~=   <@   <<|   |>>

(Veja a Seção 9.11 para conhecer o significado destes operadores.) As classes de operadores SP-GiST incluídas na distribuição padrão estão documentadas na Tabela 65.2. Para obter mais informações veja a Seção 65.3.

Assim como GiST, SP-GiST oferece suporte a procuras de vizinho-mais-próximo. Para as classes de operadores SP-GiST que suportam ordenação por distância, o operador correspondente está listado na coluna Operadores de ordenação na Tabela 65.2.

11.2.5. GIN #

Os índices GIN são índices invertidos, apropriados para valores de dados que contêm vários valores componentes, como matrizes. Um índice invertido contém uma entrada separada para cada valor de componente, e pode manipular com eficiência consultas que testam a presença de valores de componentes específicos.

Assim como os índices GiST e SP-GiST, o índice GIN pode dar suporte a muitas estratégias de indexação definidas pelo usuário, e os operadores específicos com os quais um índice GIN pode ser usado variam dependendo da estratégia de indexação. Como exemplo, a distribuição padrão do PostgreSQL inclui uma classe de operadores GIN para matrizes, que oferece suporte a consultas indexadas usando os seguintes operadores:

<@   @>   =   &&

(Veja a Seção 9.19 para conhecer o significado destes operadores.) As classes de operadores GIN incluídas na distribuição padrão estão documentadas na Tabela 65.3. Muitas outras classes de operadores GIN estão disponíveis na coleção contrib, ou como projetos separados. Para obter mais informações, consulte a Seção 65.4.

11.2.6. BRIN #

Os índices BRIN (acrônimo para Block Range INdexes), armazenam resumos sobre os valores armazenados em intervalos de blocos físicos consecutivos de uma tabela. Assim, são mais eficazes para colunas cujos valores estão bem correlacionados com a ordem física das linhas da tabela. Assim como os índices GiST, SP-GiST e GIN, o índice BRIN pode dar suporte a muitas estratégias de indexação diferentes, e os operadores específicos com os quais um índice BRIN pode ser usado variam dependendo da estratégia de indexação. Para tipos de dados que possuem uma ordem de classificação linear, os dados indexados correspondem aos valores mínimo e máximo dos valores na coluna para cada intervalo de bloco. Este índice oferece suporte a consultas indexadas usando os seguintes operadores:

<   <=   =   >=   >

As classes de operadores BRIN incluídas na distribuição padrão estão documentadas na Tabela 65.4. Para obter mais informações consulte a Seção 65.5.