Sql 如何在ApacheDerby中删除有限数量的行
我想从Derby中的表中删除一定数量的过时行。大概是这样的:Sql 如何在ApacheDerby中删除有限数量的行,sql,database,limit,derby,sql-delete,Sql,Database,Limit,Derby,Sql Delete,我想从Derby中的表中删除一定数量的过时行。大概是这样的: DELETE FROM table WHERE obsolete = 1 LIMIT 100000; 但是Derby不支持非标准限制语法。不幸的是,通常的更换也不起作用: DELETE FROM table WHERE obsolete = 1 FETCH FIRST 100000 ROWS ONLY; 虽然以下各项最终奏效,但性能非常糟糕: DELETE FROM table WHERE id IN (SELECT id FR
DELETE FROM table WHERE obsolete = 1 LIMIT 100000;
但是Derby不支持非标准限制语法。不幸的是,通常的更换也不起作用:
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多行之后重复终止,没有任何错误的迹象,光标只是停止返回行,就好像没有剩余行一样
有没有更好的方法来删除表中的大量行,但不是全部行?这只是一个建议。尝试在
(过时,id)
上添加一个索引,然后运行此变体(并可能尝试使用小于100000的编号:
DELETE
FROM table
WHERE id IN
( SELECT id
FROM table
WHERE obsolete = 1
ORDER BY id
FETCH FIRST 100000 ROWS ONLY
)
其思想是使用索引获取ID,而不是每次执行语句时都扫描整个表。是否有任何键(如时间戳)可用于筛选删除?我尝试使用日期列筛选删除,但无法预测有多少行与特定时间跨度相关联。这一点很重要我不想一次删除太多行。