Eu só queria saber se há uma diferença no custo (memória, cpu) de um EXISTS
ou NOT EXISTS
nas seguintes consultas. Faz diferença se eu selecionar ou colunas NULL
?1
1)
SELECT id
FROM Parent p
WHERE NOT EXISTS
(
SELECT NULL FROM Child c
WHERE c.parent_Id = p.id
AND c.x <> c.y
)
2)
SELECT id
FROM Parent p
WHERE NOT EXISTS
(
SELECT 1 FROM Child c
WHERE c.parent_Id = p.id
AND c.x <> c.y
)
3)
SELECT id
FROM Parent p
WHERE NOT EXISTS
(
SELECT * FROM Child c
WHERE c.parent_Id = p.id
AND c.x <> c.y
)
A opção 1 é o que eu uso normalmente, há alguma diferença ou é otimizado para o mesmo?
Você deve descobrir que cada exemplo resulta em LEFT SEMI ANTI JOIN com custos iguais.
Por hábito, costumo usar a sintaxe em seu segundo exemplo, que você poderia argumentar que sinaliza a intenção melhor do que os outros.