Sql 如何在ApacheDerby中删除有限数量的行

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

我想从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 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,而不是每次执行语句时都扫描整个表。

是否有任何键(如时间戳)可用于筛选删除?我尝试使用日期列筛选删除,但无法预测有多少行与特定时间跨度相关联。这一点很重要我不想一次删除太多行。