2011-11-23 54 views
1

我有一個是在現場rowid做大量從SQL Server刪除

我需要刪除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%') 

這需要數小時!

我能做些什麼來加快速度?

+2

是'reporttime'一個冒充爲字符串的日期嗎? – Matthew

+0

你試過解釋一下嗎? – r0ast3d

+1

那麼,'LIKE'%2011%''根本就不能使用任何索引 - 因爲你在那裏有'%'的前導。也許試圖找到一個更合適的WHERE子句來加快速度 –

回答

5
delete c 
from batchinfo b 
join calibration c 
    on batchinfo.rowid=calibration.rowid 
where reporttime not like '%2011%' 
+0

使用連接+1 – Maess

3

通過在您的選擇語句中添加Top 1000來批量處理,然後只需一次又一次地運行,直到沒有別的東西要刪除。

DELETE FROM calibration 
WHERE rowid IN (SELECT TOP 1000 
        calibration.rowid 
       FROM batchinfo 
       JOIN calibration ON batchinfo.rowid=calibration.rowid 
       WHERE reporttime NOT LIKE '%2011%') 
+0

...並反覆運行,直到沒有結果? – Matthew

+0

@Matthew PK ....是的。 –

+1

這並不能解決性能不佳的問題,使用聯接會更有效。 – Maess

2

爲什麼你需要加入?這不工作嗎?

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

或者,如果reporttime是校準的一部分:

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

你能使用WHERE EXISTS呢?

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

注:這只是另一種選擇,它看起來像JOIN S的上方應該爲你工作。但是,你知道......品種是生命的香料=)