Tentando entender Algumas coisas no plano de consulta acima.
Por que há um Stream Aggregate na consulta quando não tenho um grupo por. Eu acho que tem algo a ver com a junção sendo mesclada e está fazendo uma classificação?
Em segundo lugar, e mais importante, por que uma estimativa de 13 entrando
no agregado do fluxo resulta em uma estimativa de 24.595.900? Isso está causando o problema secundário do Object4 obter o índice clusterizado verificado em vez de um loop aninhado. Eu tive que dividir a consulta em duas consultas em vez de usar um OR e a junção se transforma em um loop aninhado e busca em Object4.
Plano de consulta
Para responder sua primeira pergunta:
O SQL Server está efetivamente reescrevendo sua consulta. Esta consulta:
Também pode ser escrito assim:
É por isso que você tem dois métodos de acesso diferentes
Object2
no plano de consulta. AMerge Join (Concatenation)
operação não é realmente uma junção de mesclagem. É apenas implementar umUNION ALL
e combinar os resultados. O agregado de fluxo que você mencionou agrupa porObject3.Column2
. Isso remove duplicatas doMerge Join (Concatenation)
e classifica os dados para que possam ser usados a seguirMERGE JOIN
para Object4.Respondendo sua segunda pergunta:
Parece um bug. Depois de alguma pesquisa, encontrei um artigo de Paul White explicando o assunto. O bug é relatado ao Connect se você quiser votar nele ou adicionar a si mesmo como afetado.
Resumindo, a estimativa de cardinalidade é 24595900 porque 27328800 (cardinalidade da tabela de
Object2
) * 0,9 = 24595900 após o arredondamento. Você está no SQL Server 2008, portanto, o cálculo do CE herdado é usado:Recomendo a leitura de todo o artigo. A questão é um pouco difícil de resumir, mas tentarei fazê-lo citando parte do texto perto do final:
Dividir a consulta como você fez deve evitar o problema. Você também pode ter alguma sorte reescrevendo a consulta usando
UNION
(veja o Exemplo 4 no artigo).