Каков внутренний алгоритм работы оператора Except под оболочками в SQL Server? Это внутренне берет хеш каждой строки и сравнивает?
Дэвид Лозинкси (David Lozinksi) провел исследование « SQL: самый быстрый способ вставки новых записей, когда его еще нет». Он показал, что оператор «Кроме» - самый быстрый для большого числа строк; тесно связывая с нашими результатами ниже.
Предположение: я думаю, что левое соединение будет самым быстрым, так как оно сравнивает только 1 столбец, за исключением того, что оно будет самым длинным, поскольку оно должно сравнивать все столбцы.
С этими результатами наше мышление теперь разве что автоматически и внутренне берет хеш каждой строки? Я посмотрел на «кроме плана выполнения», и он использует некоторый хэш.
История вопроса: наша команда сравнивала две таблицы кучи. Таблица A Строки, не указанные в таблице B, были вставлены в таблицу B.
Таблицы кучи (из устаревшей текстовой файловой системы) не имеют первичных ключей / направляющих / идентификаторов. Некоторые таблицы имели дублирующиеся строки, поэтому мы нашли хэш каждой строки, удалили дубликаты и создали идентификаторы первичного ключа.
1) Сначала мы запустили оператор исключений, исключая (столбец хеша)
select * from TableA
Except
Select * from TableB,
2) Затем мы запустили сравнение левого соединения между двумя таблицами в HashRowId.
select *
FROM dbo.TableA A
left join dbo.TableB B
on A.RowHash = B.RowHash
where B.Hash is null
Удивительно, но вставка с оператором кроме была самой быстрой.
На самом деле результаты сопоставлены с результатами тестирования Дэвида Лозинкси