sql - 如何在 Apache Derby 中删除有限数量的行

标签 sql database limit derby sql-delete

我想从 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/

相关文章:

SQL 连接与 SQL 子查询(性能)?

database - 如何正确设计数据库的这一部分(循环引用?)

mysql - 限制 SQL 语句 (MySQL) 中的特定 WHERE 子句?

MySQL 将记录数限制为一列中的 5 个唯一值

wordpress - 如何按日期限制wordpress tagcloud?

mysql - SQL查询一行中同一列的多个值

php - Laravel sql 获取顶部记录并获取其字段值平均值

需要 SQL 查询说明

php - 坐标搜索

python - PostgreSQL 表上的更新查询不起作用