#sql #sql-server
#sql #sql-сервер
Вопрос:
Здравствуйте, есть ли способ применить это с меньшими затратами времени запрос занимает слишком много времени, его 15 минут, и он все еще выполняется
DELETE FROM [1] WHERE PHONE IN(
SELECT PHONE FROM [2]
WHERE call_date BETWEEN '2019-03-04' AND '2019-03-22'
UNION
SELECT PHONE FROM [3]
)
GO
Ответ №1:
Я бы рекомендовал:
DELETE one FROM [1] one
WHERE EXISTS (SELECT 1
FROM [3] three
WHERE three.phone = one.phone
) OR
EXISTS (SELECT 1
FROM [2] two
WHERE one.phone = two.phone AND
two.call_date BETWEEN '2019-03-04' AND '2019-03-22'
);
И затем рекомендуется индексировать на [2](phone, call_date)
и [3](phone)
.
Комментарии:
1. . . . [3] является ли имя таблицы не значением строки. Итак, вам понадобятся другие
exists
.2. Любопытно: как
SELECT PHONE FROM [3]
перевести наWHERE PHONE = 3
?3. @tonypdmtr . . . Я неправильно истолковал вопрос. Я скорректировал ответ.
4. И индексировать на
[1](phone)
?5. @kobik . . . Я не думаю, что это необходимо.
Ответ №2:
Я бы попробовал с EXISTS
с OR
вместо UNION
:
DELETE o
FROM [1] o
WHERE EXISTS (SELECT 1
FROM [2] t
WHERE o.phone = t.phone AND
t.call_date >= '2019-03-04' AND t.call_date <= '2019-03-22'
) OR
EXISTS (SELECT 1 FROM [3] tr WHERE tr.phone = o.phone);