2012-02-24 47 views
2

我想從Derby中的表中刪除一定數量的過時行。像這樣:如何在Apache Derby中刪除有限數量的行

DELETE FROM table WHERE obsolete = 1 LIMIT 100000; 

但Derby不支持非標準的LIMIT語法。不幸的是,通常更換無法正常工作或:

DELETE FROM table WHERE obsolete = 1 FETCH FIRST 100000 ROWS ONLY; 

而下面最終的作品,表演是可怕的:

DELETE FROM table WHERE id IN 
(SELECT id FROM table WHERE obsolete = 1 FETCH FIRST 100000 ROWS ONLY); 

並遍歷一個ResultSet調用.deleteRow()訪問了幾個反覆之後終止比64K行,沒有跡象表明任何事情都出錯了,光標停止返回行,就好像沒有剩下任何東西。

是否有更好的方法來刪除表中的大量行,但不是全部行?

+1

是否有任何可用於過濾刪除的鍵(例如時間戳)? – 2012-02-24 20:46:28

+0

我試圖使用日期列過濾刪除,但無法預測有多少行與任何特定時間跨度很重要的是,我不要一次刪除太多的行。 – Andrew 2012-02-24 21:28:00

回答

2

這只是一個建議。嘗試在(obsolete, id)添加索引,然後運行這個變化(也許可以和小於100000號試驗:

DELETE 
FROM table 
WHERE id IN 
     (SELECT id 
     FROM table 
     WHERE obsolete = 1 
     ORDER BY id 
     FETCH FIRST 100000 ROWS ONLY 
    ) 

的想法是使用索引來獲取ID和每一個語句是時候不掃描整個表