O uso de condições duplicadas no PostgreSQL pode causar algum problema?
Por exemplo, tenho uma tabela de compras com um ID de cliente e minha estrutura em alguns casos duplica uma condição de pesquisa, como no exemplo abaixo.
SELECT p.*
FROM purchases p
WHERE p.customer_id = 123
AND p.customer_id = 123;
OU
SELECT p.*
FROM purchases p
WHERE p.customer_id = 123
AND p.salesman = 456
AND p.departament = 789
AND p.customer_id = 123;
Sim, isso pode causar estimativas de consulta incorretas. Se o PostgreSQL achar que
WHERE p.customer_id = 123
retornará 10% das linhas da tabela, ele pensará queWHERE p.customer_id = 123 AND p.customer_id = 123
retornará apenas 1% da tabela, pois não percebe que as condições são realmente as mesmas e as trata como estatisticamente independentes.Estimativas ruins podem levar a más escolhas de planos e mau desempenho.
Talvez isso não importe tanto no seu caso: o PostgreSQL coloca um limite inferior de 1 em cada estimativa de contagem de linhas, portanto, se sua consulta deduplicada já estiver estimada para retornar muito poucas linhas, não haverá muito dano.
Experimente usar
EXPLAIN
!De acordo com meus testes em 12.6, depende do predicado:
Então, nesse caso, não há problema. A estimativa de linha e os custos são constantes.
Possivelmente isso ocorre porque um índice está envolvido, porque um predicado ilike é afetado negativamente por isso:
Observe o pequeno aumento no custo e a redução na contagem de linhas estimadas.
Eu acho que isso também pode ser sensível à versão, então sugiro que você verifique sua versão com os predicados e o esquema com os quais você está preocupado.