O jsonb_column @> '{"key":value}'::jsonb
operador é igual a jsonb_column->'key' = value
? em termos de resultado, desempenho e índices que serão utilizados?
O jsonb_column @> '{"key":value}'::jsonb
operador é igual a jsonb_column->'key' = value
? em termos de resultado, desempenho e índices que serão utilizados?
Eu criei um pequeno teste para verificar isso:
Em seguida, inseri alguns dados gerados:
Vamos encontrar algo lá ( versão 1 ):
O plano de execução parece
Se eu fizer o mesmo com a outra versão ( versão 2 ) que você propõe (com o operador alterado de
->
para->>
, acho que você quis dizer isso):eu recebo um plano como
Executando-os repetidamente, não vejo diferença significativa entre os tempos de execução. Não é de admirar - a operação cara aqui é a varredura sequencial, enquanto as duas condições de filtro diferentes não devem ser muito diferentes a esse respeito.
Agora eu adiciono um índice GIN em
data
:Ao executar as consultas agora, a versão 2 faz o mesmo que acima, enquanto a versão 1 tem um novo plano:
Isso já mostra que as duas versões não são totalmente equivalentes - um índice GIN na
jsonb
coluna suporta apenas uma delas ( versão 1 ).Pode-se definir um outro índice para ajudar a versão 2 :
Agora a versão 2 dá o seguinte:
Neste experimento, não vejo uma grande diferença de desempenho entre os dois, dada a indexação adequada. No entanto, você deve considerar o seguinte :
Normalmente, diz-se que os índices BTree são mais baratos de manter (o que significa que as alterações de dados na tabela têm uma sobrecarga menor) que os índices GIN. Pela leitura, nem sempre é esse o caso - você deve testar essas soluções em seu próprio conjunto de dados. Por exemplo, não consigo dizer de cabeça se um conjunto de
jsonb
valores muito complexos prefere isso ou aquilo.Notas:
json(b)
operadores, a documentação oficial é uma excelente fonte.