Assumindo
id
não apenas UNIQUE
- conforme imposto pelo seu UNIQUE INDEX
- mas também NOT NULL
. (Isso está faltando na sua definição de tabela.) SELECT meta_split.key, meta_split.value, count(*)
FROM voc_cc348779bdc84f8aab483f662a798a6a v
CROSS JOIN LATERAL jsonb_each(v.meta) AS meta_split
GROUP BY meta_split.key, meta_split.value;
Equivalente mais curto:
SELECT meta_split.key, meta_split.value, count(*)
FROM voc_cc348779bdc84f8aab483f662a798a6a v, jsonb_each(v.meta) AS meta_split
GROUP BY 1, 2;
O
LEFT [OUTER] JOIN
era ruído porque o seguinte teste WHERE meta_split.value IS NOT NULL
força um INNER JOIN
de qualquer forma. Usando CROSS JOIN
em vez de. Além disso, como
jsonb
não permite chaves duplicadas no mesmo nível (o que significa o mesmo id
só pode aparecer uma vez por (key, value)
), DISTINCT
é apenas ruído caro. count(v.id)
faz o mesmo mais barato. E count(*)
é equivalente e mais barato, ainda - assumindo id
é NOT NULL
como indicado no topo. count(*)
tem uma implementação separada
e é um pouco mais rápido que count(<value>)
. É sutilmente diferente de count(v.*)
. Ele conta todas as linhas, não importa o quê. Enquanto o outro formulário não conta NULL
valores. Ou seja, desde que
id
não pode ser NULL
- como indicado no topo. id
deve realmente ser a PRIMARY KEY
, que é implementado com um índice B-tree exclusivo internamente de qualquer maneira, e todas as colunas - apenas id
aqui - são NOT NULL
implicitamente. Ou pelo menos NOT NULL
. Um UNIQUE INDEX
não se qualifica totalmente como substituição, ainda permite NULL
valores que não são considerados iguais e são permitidos várias vezes. Ver:-
Por que posso criar uma tabela com PRIMARY KEY em uma coluna anulável?
-
Criar restrição exclusiva com colunas nulas
Além disso, os índices não são úteis aqui, pois todas as linhas precisam ser lidas de qualquer maneira. Então isso nunca vai ser muito barato. Mas 62 mil linhas não é uma contagem de linhas incapacitante de forma alguma - a menos que você tenha um grande número de chaves no
jsonb
coluna. As opções restantes para acelerá-lo:
-
Normalize seu projeto. Desaninhar documentos JSON não é gratuito.
-
Mantenha uma visão materializada. A viabilidade e os custos dependem fortemente de seus padrões de gravação.
É aí que os índices podem desempenhar um papel novamente ...