Qual è l'algoritmo interno di come funziona l' operatore Except sotto le copertine di SQL Server? Prende internamente un hash di ogni riga e confronta?
David Lozinksi ha condotto uno studio, SQL: il modo più veloce per inserire nuovi record in cui uno non esiste già. Ha mostrato che l'istruzione Except è la più veloce per file di grandi dimensioni; strettamente legato ai nostri risultati di seguito.
Presupposto: penso che il join sinistro sarebbe più veloce, in quanto confronta solo 1 colonna, tranne che richiederebbe il tempo più lungo, poiché deve confrontare tutte le colonne.
Con questi risultati, ora il nostro pensiero è Tranne automaticamente e internamente prende un hash di ogni riga? Ho esaminato Tranne il piano di esecuzione e utilizza un po 'di hash.
Contesto: il nostro team stava confrontando due tabelle heap. Tabella A Le righe non nella tabella B sono state inserite nella tabella B.
Le tabelle heap (dal filesystem di testo legacy) non hanno chiavi / guide / identificatori primari. Alcune tabelle avevano righe duplicate, quindi abbiamo trovato l'hash di ogni riga, rimosso i duplicati e creato identificatori di chiave primaria.
1) Per prima cosa abbiamo eseguito un'istruzione di esclusione, escluso (colonna hash)
select * from TableA
Except
Select * from TableB,
2) Quindi abbiamo eseguito un confronto a sinistra tra le due tabelle su HashRowId
select *
FROM dbo.TableA A
left join dbo.TableB B
on A.RowHash = B.RowHash
where B.Hash is null
sorprendentemente l'inserto Except Statement era il più veloce.
I risultati in realtà corrispondono ai risultati dei test di David Lozinksi