A inclusão DISTINCT
no exemplo a seguir tem algum impacto no tempo de execução da consulta?
É sábio usá-lo como uma dica às vezes?
SELECT *
FROM A
WHERE A.SomeColumn IN (SELECT DISTINCT B.SomeColumn FROM B)
A inclusão DISTINCT
no exemplo a seguir tem algum impacto no tempo de execução da consulta?
É sábio usá-lo como uma dica às vezes?
SELECT *
FROM A
WHERE A.SomeColumn IN (SELECT DISTINCT B.SomeColumn FROM B)
Ao se perguntar sobre coisas como essa, você deve comparar os planos de execução para suas consultas.
A forma do plano de execução para sua consulta, é claro, será diferente, dependendo de quantas linhas você tem em suas tabelas e quais índices estão definidos.
Um cenário que mostra que não há diferença no desempenho é quando há substancialmente mais linhas do
A
que emB
. O otimizador então escolheráB
como a tabela de controle em uma junção de loop aninhada contraA
. Para obter um resultado correto, ele deve usar um Stream Aggregate na tabelaB
em ambas as consultas para obter apenas as linhas distintas deB
. Portanto, neste caso, a palavra-chave distinta não tem impacto no desempenho.O plano de execução para dois outros casos óbvios a serem testados, mais linhas em B do que A e igual número de linhas nas tabelas, também mostra exatamente o mesmo plano de execução para as consultas.
Atualizar
Antes da otimização da consulta, a consulta passa por uma fase de simplificação. Você pode ver a aparência da árvore lógica usando o sinalizador de rastreamento 8606.
A árvore de entrada para as consultas são claramente diferentes, mas após a simplificação, elas são as mesmas.
Ref: Mais sinalizadores de rastreamento do otimizador de consulta não documentado e mergulho profundo no otimizador de consulta – Parte 2
Árvore de entrada e árvore simplificada para consulta usando distintos:
Árvore de entrada e árvore simplificada para consulta sem uso distinto: