Consulta:
select * from table where col in ( values (?), (?), (?) )
O texto da consulta é gerado e o número de (?) é variável e pode ir até 10.000.
Funciona muito bem, apenas me perguntando se o Postgres armazena em cache a mesma instância do plano para diferentes números de argumentos?
Em outras palavras: qual é a chave para o cache do plano no Postgres? E como isso se aplica à consulta acima?
Você altera o número de parâmetros na consulta? Agora você tem uma
query
perspectiva diferente do planejador de consultas. Portanto, neste caso não haverá reutilização do plano de execução (a menos que você use o mesmo número de parâmetros), pois pode haver 10.000 planos de execução conforme você altera o número de variáveis dentro de 'IN'. Como observação, os identificadores citados "mytable" e "MYTABLE" diferenciam maiúsculas de minúsculas, portanto, existem objetos diferentes e produzem planos de execução diferentes.É a instrução preparada associada à consulta, se houver, e isso não acontece automaticamente. Fora das instruções preparadas, não há cache de plano.
Da documentação :
As instruções preparadas também podem ser usadas no nível do protocolo usando o fluxo Analisar/Bind/Executar; nesse caso, se o seu código as utiliza depende do driver e das configurações do lado do cliente.
Mesmo quando se utilizam demonstrações preparadas, a reutilização do plano depende de
plan_cache_mode
. Isso porque não é necessariamente bom reutilizar o mesmo plano com valores de parâmetros diferentes.Consultas como
select * from table where id in ($1,$2)
eselect * from table where id in ($1,$2,$3)
não podem ser representadas pela mesma instrução preparada, portanto devem ser planejadas separadamente.Mas
select * from table where id=ANY($1)
pode ser reutilizado com diferentes números de valores expressos como uma única matriz nas mesmas instruções preparadas.Você pode usar
EXPLAIN (ANALYZE, VERBOSE) EXECUTE name_of_prepared_statement(list-of-values)
e observarPlanning Time
a saída para ver quão mais rápido é quando as condições são atendidas para reutilizar o plano de execução.