Когда план выполнения изменяется для DELETE TOP(X) в Microsoft SQL Server?

Я наблюдаю немного странное поведение в Microsoft SQL Server 2017. Когда я DELETE данные строка за строкой:

DELETE TOP(1) 
FROM [table_A] 
WHERE [id] IN (SELECT [i] FROM [table_B])

это займет около 4 минут. (База данных 11 ГБ)

но когда я выполню:

DELETE TOP(1000) 
FROM [table_A] 
WHERE [id] IN (SELECT [i] FROM [table_B])

на той же таблице выполнение выполняется очень быстро (<< 1 секунда).

Разница в плане исполнения.

Вопрос: как заставить SQL Server использовать план выполнения из второго оператора (DELETE TOP(**1000**) ...) для первого утверждения (DELETE TOP(**1**) ...)?

увидеть:

введите описание изображения здесь

1 ответ

Вопрос: как заставить SQL Server использовать план выполнения из второго оператора (DELETE TOP (1000)...) для первого оператора (DELETE TOP (1)...)?

Вы можете вызвать определенный тип соединения с помощью подсказки:

DELETE TOP(1) FROM [table_A] 
WHERE [id] IN (SELECT [i] FROM [table_B]) 
-- OPTION(LOOP JOIN);
-- OPTION(HASH JOIN);

DBFiddle Demo

Другие вопросы по тегам