делает большое удаление с сервера SQL - PullRequest
1 голос
/ 23 ноября 2011

у меня есть две таблицы, которые объединены в поле rowid

Мне нужно удалить строки из calibration, которые соответствуют определенному условию на основе другой таблицы

есть приблизительно 50000 строк в batchinfo и 3 миллиона строк в calibration

вот мое заявление sql:

delete from calibration where rowid in (

select calibration.rowid from batchinfo 
join calibration on batchinfo.rowid=calibration.rowid
where reporttime not like '%2011%')

это занимает часы !!

что я могу сделать, чтобы ускорить это?

Ответы [ 5 ]

5 голосов
/ 23 ноября 2011
delete c
from batchinfo b
join calibration c
    on batchinfo.rowid=calibration.rowid
where reporttime not like '%2011%'
3 голосов
/ 23 ноября 2011

Вы должны просто удалить с помощью JOIN и забыть оператор IN.
Подробности смотрите в этом вопросе:
T-SQL: Выбор строк для удаления с помощью объединений

3 голосов
/ 23 ноября 2011

Обработайте его партиями, добавив Top 1000 в выбранный вами статус, а затем просто запускайте снова и снова, пока больше нечего удалять.

2 голосов
/ 23 ноября 2011

Зачем вам нужно объединение? Разве это не работает?

delete from calibration where rowid in (
select batchinfo.rowid from batchinfo 
where reporttime not like '%2011%')

Или, если отчетное время является частью калибровки:

delete from calibration where rowid in (
select batchinfo.rowid from batchinfo ) and reporttime not like '%2011%'
1 голос
/ 23 ноября 2011

Не могли бы вы использовать WHERE EXISTS вместо?

DELETE 
FROM calibration 
WHERE EXISTS 
    (SELECT batchinfo.rowid 
     FROM batchinfo  
     WHERE 
         batchinfo.rowid = calibaration.rowid AND
         reporttime NOT LIKE '%2011%')

Примечание: это просто еще один вариант, похоже, что JOIN выше должны работать для вас. Но, вы знаете ... разнообразие - это пряность жизни =)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...