No Postgres, você pode especificar uma cláusula IN, assim:
SELECT * FROM user WHERE id IN (1000, 1001, 1002)
Alguém sabe qual é o número máximo de parâmetros que você pode passar para IN?
postgresql
Alex Riley
fonte
fonte
PLANO DE CONSULTA
Mas se tentar a segunda consulta:
PLANO DE CONSULTA
Podemos ver que o postgres constrói a tabela temporária e se junta a ela
fonte
Não há limite para o número de elementos que você está passando para a cláusula IN. Se houver mais elementos, ele será considerado como matriz e, para cada varredura no banco de dados, verificará se está contido na matriz ou não. Essa abordagem não é tão escalável. Em vez de usar a cláusula IN, tente usar INNER JOIN com a tabela temporária. Consulte http://www.xaprb.com/blog/2006/06/28/why-large-in-clauses-are-problematic/ para obter mais informações. O uso de escalas INNER JOIN bem como o otimizador de consulta pode fazer uso de junção de hash e outra otimização. Enquanto na cláusula IN não há como o otimizador otimizar a consulta. Eu notei uma aceleração de pelo menos 2x com essa alteração.
fonte
OR
eIN
cláusulas de consultas devido à grande sobrecarga na análise e no planejamento de tais consultas, mas não pude confirmar o problema com o Postgres 9.5. Consulte esta resposta .Como alguém mais experiente no Oracle DB, eu também estava preocupado com esse limite. Realizei um teste de desempenho para uma consulta com ~ 10.000 parâmetros em uma lista
IN
, buscando números primos de até 100.000 de uma tabela com os primeiros 100.000 , listando todos os números primos como parâmetros de consulta .Meus resultados indicam que você não precisa se preocupar em sobrecarregar o otimizador de plano de consulta ou obter planos sem o uso de índice , pois ele transformará a consulta em uso,
= ANY({...}::integer[])
onde poderá aproveitar os índices conforme o esperado:No entanto, esse tópico (bastante antigo) na lista de discussão pgsql-hackers indica que ainda há um custo não negligenciável no planejamento de tais consultas, então aceite minha palavra com um pouco de sal.
fonte
Se você tiver uma consulta como:
você pode aumentar a performance se reescrever sua consulta como:
fonte
EXPLAIN
diz que está reescrevendo internamente meuIN (...)
comoANY ('{...}'::integer[])
.Apenas tentei. a resposta é -> número inteiro fora do intervalo como um valor de 2 bytes: 32768
fonte
Convém refatorar essa consulta em vez de adicionar uma lista arbitrariamente longa de IDs ... Você pode usar um intervalo se os IDs realmente seguirem o padrão no seu exemplo:
Outra opção é adicionar uma seleção interna:
fonte