Ao selecionar um número de registros de uma tabela Postgres com base em uma lista de IDs passada como parâmetro, quais são os benefícios e desvantagens de
SELECT id, <more...>
FROM tbl
INNER JOIN UNNEST($1) AS id USING (id)
contra
SELECT id, <more...>
FROM tbl
WHERE id = ANY($1)
e em quais casos um deve ser preferido ao outro?
DB: Postgres 14 e superior.
Nota: Esta não é uma duplicata de Obtendo por lista de ids: `unnest() JOIN` vs `= ANY()`, pois a lista não é constante.
O importante é que ambos não são equivalentes .
... JOIN UNNEST($1) AS id USING (id)
preserva quaisquer duplicatas na matriz e retorna linhas de resultados duplicadas adequadamente.... WHERE id = ANY($1)
efetivamente dobra duplicatas no lado direito (na matriz).(Ambos mantêm duplicatas no lado esquerdo, se houver.)
Diferentes planos de consulta podem resultar dessa funcionalidade diferente.
Diferentes ordens de classificação (a menos que sejam classificadas explicitamente) podem resultar desses diferentes planos de consulta.
Valores nulos são tratados da mesma forma, o que fica mais complicado com
NOT IN
ou<> ALL ()
... Veja:Você pode saber que o array não contém duplicatas (nesse caso, a principal diferença é anulada), mas o Postgres não sabe disso.
unnest()
tende a ser mais rápido com arrays grandes, por esse motivo.