Який внутрішній алгоритм роботи оператора Except під обкладинками SQL Server? Чи внутрішньо він займає хеш кожного ряду і порівнює?
Девід Лозінкі провів дослідження, 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
напрочуд, Вставка за винятком виписки була найшвидшою.
Результати насправді співпадають з результатами тестування Девіда Лозінксі