H2(文件)删除性能

H2 (File) Delete Performance

当涉及到 AUTO-SERVER 模式下的基于文件的 H2 数据库时,我遇到了一些性能问题。我正在使用 H2 版本 1.3.174。该数据库包含一个包含 5 列的 table。其中一列是 CLOB,(平均)每行包含 1 KB 的文本数据。在单线程测试 运行 中,我插入了 800,000 行,耗时 409 秒 - 对我来说没问题。我执行了第二个测试 运行,步骤如下:

  1. 从数据库中加载前 100 条消息。消息顺序通过主键 (NUMBER) 值建立。
  2. 使用以下语句删除这 100 条消息:DELETE FROM mytable WHERE id IN (...);

直到删除数据库的 790,000 行为止。在我的真实场景中,步骤 1 和步骤 2 之间会涉及一些处理。第二次测试 运行 在没有负载的快速机器上耗时 8.5 小时!我观察到在删除过程中,H2 创建了名称类似于 "mydb.1978734278.38.temp.db" 的临时文件,其大小在 24 到 1,300 MB 之间快速变化。

这是预期的行为吗?任何想法我可能做错了什么?感谢您的帮助!

我正在用我的发现回答我自己的问题:

  1. 主要问题是 SELECT 语句,这是由于缺少索引。一旦正确的 INDEX 就位,SELECT/DELETE 测试 运行 只用了 2 分钟。
  2. 在使用 CLOBS 或 LONGVARBINARY 而不是 VARCHAR 时似乎存在 space 问题:使用后者时文件大小减半。