Как удалить ограниченное количество строк в Apache Derby - PullRequest
2 голосов
/ 25 февраля 2012

Я хочу удалить определенное количество устаревших строк из таблицы в 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 () несколько раз завершается послеПосещение нескольких строк размером более 64 КБ, без указания того, что что-то пошло не так, курсор просто прекращает возвращать строки, как будто их не осталось.

Есть ли лучший способ удалить большое число, но невсех строк в таблице?

1 Ответ

2 голосов
/ 25 февраля 2012

Это всего лишь предложение.Попробуйте добавить индекс на (obsolete, id), а затем запустите этот вариант (и, возможно, экспериментируйте с числом, меньшим 100000):

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

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

...