У меня проблемы с производительностью SQL. По внезапной причине следующие запросы очень медленные:
У меня есть два списка, содержащий Id определенной таблицы. Мне нужно удалить все записи из первого списка, если Id уже существует во втором списке:
DECLARE @IdList1 TABLE(Id INT)
DECLARE @IdList2 TABLE(Id INT)
-- Approach 1
DELETE list1
FROM @IdList1 list1
INNER JOIN @IdList2 list2 ON list1.Id = list2.Id
-- Approach 2
DELETE FROM @IdList1
WHERE Id IN (SELECT Id FROM @IdList2)
Возможно, что в двух списках содержится более 10.000 записей. В этом случае оба запроса выполняются каждые 20 секунд.
План выполнения также показал то, что я не понимаю. Может быть, это объясняет, почему это так медленно:
Я заполнил оба списка с 10.000 последовательными целыми числами, поэтому оба списка содержали значение 1-10 000 в качестве отправной точки.
Как вы можете видеть, оба запроса отображаются для @IdList2. Фактическое количество строк - 50.005.000!!. @IdList1 является правильным (фактическое количество строк - 10.000)
Я знаю, что есть другие способы решения этой проблемы. Как заполнение третьего списка, установленного для удаления из первого списка. Но мой вопрос:
Почему эти запросы на удаление так медленно и почему я вижу эти странные планы запросов?