Qual é o algoritmo interno de como o operador Except funciona nos bastidores do SQL Server? Será necessário internamente um hash de cada linha e comparar?
David Lozinksi realizou um estudo, SQL: A maneira mais rápida de inserir novos registros onde um ainda não existe. Ele mostrou que a instrução Except é a mais rápida para grandes linhas de número; intimamente ligada aos nossos resultados abaixo.
Suposição: Eu acho que a junção à esquerda seria mais rápida, pois compara apenas 1 coluna, exceto que levaria mais tempo, pois precisa comparar todas as colunas.
Com esses resultados, agora nosso pensamento é Exceto automática e internamente, um hash de cada linha? Eu olhei para o plano de execução Exceto e ele utiliza algum hash.
Histórico: Nossa equipe estava comparando duas tabelas de heap. Tabela A Linhas que não estão na Tabela B, foram inseridas na Tabela B.
As tabelas de heap (do sistema de arquivos de texto herdado) não possuem chaves / guias / identificadores primários. Algumas das tabelas tinham linhas duplicadas; portanto, encontramos o Hash de cada linha, removemos duplicatas e criamos identificadores de chave primária.
1) Primeiro, executamos uma instrução exceto, excluindo (coluna de hash)
select * from TableA
Except
Select * from TableB,
2) Em seguida, fizemos uma comparação de junção esquerda entre as duas tabelas no HashRowId
select *
FROM dbo.TableA A
left join dbo.TableB B
on A.RowHash = B.RowHash
where B.Hash is null
surpreendentemente, o Except Statement Insert foi o mais rápido.
Na verdade, os resultados são mapeados perto dos resultados dos testes de David Lozinksi