我想从 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);
在访问超过 64K 行后,对 ResultSet 调用 .deleteRow() 进行迭代会重复终止,没有任何迹象表明出现任何问题,游标只是停止返回行,就好像没有任何剩余行一样。
是否有更好的方法来删除表中的大量(但不是全部)行?
最佳答案
这只是一个建议。尝试在 (obsolete, id)
上添加索引,然后运行此变体(也许可以尝试使用小于 100000
的数字:
DELETE
FROM table
WHERE id IN
( SELECT id
FROM table
WHERE obsolete = 1
ORDER BY id
FETCH FIRST 100000 ROWS ONLY
)
这个想法是使用索引来获取 ids,而不是每次执行语句时都扫描整个表。
关于sql - 如何在 Apache Derby 中删除有限数量的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9437776/