¿Cuál es el algoritmo interno de cómo funciona el operador Excepto bajo las cubiertas en SQL Server? ¿Toma internamente un hash de cada fila y compara?
David Lozinksi realizó un estudio, SQL: la forma más rápida de insertar nuevos registros donde todavía no existe . Mostró que la declaración Except es la más rápida para filas de números grandes; estrechamente vinculado a nuestros resultados a continuación.
Supuesto: creo que la unión izquierda sería la más rápida, ya que solo compara 1 columna, excepto que tomaría más tiempo, ya que tiene que comparar todas las columnas.
Con estos resultados, ahora nuestro pensamiento es ¿Excepto automáticamente e internamente toma un hash de cada fila? Miré el plan de ejecución Excepto y utiliza algo de hash.
Antecedentes: nuestro equipo estaba comparando dos tablas de montón. Tabla A Las filas que no están en la Tabla B, se insertaron en la Tabla B.
Las tablas de montón (del sistema de archivos de texto heredado) no tienen claves / guías / identificadores primarios. Algunas de las tablas tenían filas duplicadas, por lo que encontramos el hash de cada fila, eliminamos duplicados y creamos identificadores de clave principal.
1) Primero ejecutamos una declaración except, excluyendo (columna hash)
select * from TableA
Except
Select * from TableB,
2) Luego ejecutamos una combinación de combinación izquierda entre las dos tablas en el HashRowId
select *
FROM dbo.TableA A
left join dbo.TableB B
on A.RowHash = B.RowHash
where B.Hash is null
Sorprendentemente, el Except Statement Insert fue el más rápido.
Los resultados en realidad se corresponden con los resultados de las pruebas de David Lozinksi