@Tregoreg levantou uma pergunta no comentário para sua recompensa oferecida:
Não encontrei as respostas atuais funcionando. Usar o índice GIN na coluna do tipo matriz não aumenta o desempenho do operador ANY (). Realmente não há solução?
@ A resposta aceita por Frank diz para você usar operadores de matriz , o que ainda está correto para o Postgres 11. O manual:
... a distribuição padrão do PostgreSQL inclui uma classe de operador GIN para matrizes, que suporta consultas indexadas usando estes operadores:
<@
@>
=
&&
A lista completa de classes de operadores internas para índices GIN na distribuição padrão está aqui.
No Postgres, os índices são vinculados aos operadores (que são implementados para certos tipos), não apenas tipos de dados, funções ou qualquer outra coisa. Essa é uma herança do design original do Postgres de Berkeley e muito difícil de mudar agora. E geralmente está funcionando muito bem. Aqui está um tópico sobre pgsql-bugs com Tom Lane comentando sobre isso.
Algumas funções do PostGis (como ST_DWithin()
) parecem violar esse princípio, mas não é assim. Essas funções são reescritas internamente para usar os respectivos operadores .
A expressão indexada deve estar à esquerda do operador. Para a maioria dos operadores ( incluindo todos os itens acima ), o planejador de consultas pode conseguir isso invertendo operandos se você colocar a expressão indexada à direita - desde que a COMMUTATOR
tenha sido definida. A ANY
construção pode ser usada em combinação com vários operadores e não é um operador em si. Quando usado como constant = ANY (array_expression)
apenas índices que suportam o =
operador em elementos da matriz se qualificariam e precisaríamos de um comutador para = ANY()
. Os índices GIN estão fora.
Atualmente, o Postgres não é inteligente o suficiente para derivar uma expressão indexável a GIN. Para iniciantes, nãoconstant = ANY (array_expression)
é completamente equivalente a array_expression @> ARRAY[constant]
. Os operadores de matriz retornam um erro se houver algum elemento NULL envolvido, enquanto a ANY
construção pode lidar com NULL em ambos os lados. E há resultados diferentes para incompatibilidades de tipo de dados.
Respostas relacionadas:
Apartes
Ao trabalhar com integer
matrizes ( int4
, não int2
ou int8
) sem NULL
valores (como o seu exemplo indica), considere o módulo adicional intarray
, que fornece operadores mais rápidos e especializados e suporte ao índice. Vejo:
Quanto à UNIQUE
restrição em sua pergunta que ficou sem resposta: isso é implementado com um índice btree em todo o valor da matriz (como você suspeitava) e não ajuda na busca de elementos . Detalhes:
jsonb
e os índices? postgresql.org/docs/9.5/static/functions-json.html e postgresql.org/docs/9.5/static/datatype-json.html#JSON-INDEXING