Как применить следующее с меньшими затратами времени

#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);