Jaki jest wewnętrzny algorytm jak wyjątkiem operatora działa pod kołdrą w SQL Server? Czy to wewnętrznie zajmuje hash każdego wiersza i porównuje?
David Lozinksi przeprowadził badanie, SQL: Najszybszy sposób wstawiania nowych rekordów tam, gdzie jeszcze nie istnieje . Pokazał, że instrukcja Except jest najszybsza dla dużej liczby wierszy; ściśle powiązane z naszymi wynikami poniżej.
Założenie: Sądzę, że lewe łączenie byłoby najszybsze, ponieważ porównuje tylko 1 kolumnę, z wyjątkiem najdłuższego, ponieważ musi porównać wszystkie kolumny.
Z tymi wynikami, teraz nasze myślenie jest wyjątkiem, z wyjątkiem tego, że automatycznie pobiera skrót każdego wiersza? Spojrzałem na plan wykonania z wyjątkiem, który wykorzystuje pewien skrót.
Tło: Nasz zespół porównywał dwie tabele stert. Tabela A Rzędy niewymienione w tabeli B zostały wstawione do tabeli B.
Tabele sterty (ze starszego systemu plików tekstowych) nie mają kluczy głównych / prowadnic / identyfikatorów. Niektóre tabele miały zduplikowane wiersze, więc znaleźliśmy wartość skrótu każdego wiersza, usunęliśmy duplikaty i utworzyliśmy identyfikatory klucza głównego.
1) Najpierw uruchomiliśmy instrukcję wyjątkiem, z wyłączeniem (kolumna mieszania)
select * from TableA
Except
Select * from TableB,
2) Następnie przeprowadziliśmy porównanie lewego łączenia między dwiema tabelami na HashRowId
select *
FROM dbo.TableA A
left join dbo.TableB B
on A.RowHash = B.RowHash
where B.Hash is null
zaskakująco, z wyjątkiem instrukcji Insert Insert było najszybsze.
Wyniki faktycznie są zbliżone do wyników testów Davida Lozinksi