PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Índice de várias colunas em 3 campos com tipos de dados heterogêneos

Índice de coluna única


O Postgres pode combinar vários índices de forma muito eficiente em uma única consulta com varreduras de índice de bitmap . Na maioria das vezes, o índice mais seletivo é escolhido (ou dois, combinado com varreduras de índice de bitmap) e o restante é filtrado. Uma vez que o conjunto de resultados é estreito o suficiente, não é eficiente varrer mais índices.

Índice de várias colunas


Ainda é mais rápido ter um índice de várias colunas perfeitamente correspondente, mas não por ordens de magnitude.
Como você deseja incluir um tipo de matriz Sugiro usar um GIN índice. AFAIK, classes de operadores estão ausentes para índices GiST de uso geral no tipo de matriz. (A exceção é intarray para integer matrizes.)

Para incluir o integer coluna, primeiro instale o módulo adicional btree_gin , que fornece as classes de operadores GIN necessárias. Execute uma vez por banco de dados :
CREATE EXTENSION btree_gin;

Então você deve ser capaz de criar seu índice de várias colunas:
CREATE INDEX tbl_abc_gin_idx ON tbl USING GIN(a, b, c);

A ordem das colunas de índice é irrelevante para índices GIN. O manual:

Um índice GIN de várias colunas pode ser usado com condições de consulta que envolvem qualquer subconjunto das colunas do índice. Ao contrário de B-tree ou GiST, a eficácia da pesquisa de índice é a mesma, independentemente de qual(is) coluna(s) de índice as condições de consulta usam.

Pesquisa do vizinho mais próximo


Como você está incluindo uma geometry PostGis tipo, é provável que você queira fazer uma pesquisa de vizinho mais próximo, para a qual você precisa de um GiST índice. Neste caso, sugiro dois índices:
CREATE INDEX tbl_ac_gist_idx ON tbl USING GiST(a, c);  -- geometry type
CREATE INDEX tbl_bc_gin_idx  ON tbl USING GIN(b, c);

Você pode adicionar o integer coluna c para um ou ambos. Depende. Para isso, você precisa de btree_gin ou btree_gist ou ambos, respectivamente.