2012-02-24 1 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

Есть ли какие-либо ключи, такие как временные метки, которые можно использовать для фильтрации удаления? –

+0

Я попытался отфильтровать удаление с помощью столбца даты, но я не могу предсказать, сколько строк связано с каким-либо конкретным Я не пытаюсь удалить слишком много строк сразу. – Andrew

ответ

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 
    ) 

Идея заключается в том, чтобы использовать индекс, чтобы получить идентификаторы и не сканировать всю таблицу каждый раз, когда утверждение является Выполнено.