为什么 运行 对嵌入式 HSQLDB 的更新查询会消耗大量内存?
Why does running an update query on an embedded HSQLDB consume a lot of memory?
我正在使用 HSQLDB 2.4.1(嵌入了缓存表)。我有一个大型数据库(约 2100 万行。数据库大小为 5GB)
我正在尝试 运行 以下查询:
UPDATE TABLE_NAME SET COLUMN1=0
我尝试更改和使用这些属性,但最终此更新语句消耗了大量 ram,就好像它正在将整个数据库复制到内存中一样。
properties.setProperty("hsqldb.large_data" , "true");
properties.setProperty("hsqldb.log_data" , "false");
properties.setProperty("hsqldb.default_table_type" , "cached");
properties.setProperty("hsqldb.result_max_memory_rows" , "50000");
properties.setProperty("hsqldb.tx" , "mvcc");
properties.setProperty("sql.enforce_tdc_update" , "false");
properties.setProperty("shutdown" , "true");
properties.setProperty("runtime.gc_interval" , "100000");
当我在 DBeaver 中执行此查询时,我注意到内存消耗显着增加并一直增加,直到达到 4GB 的最大内存,此时应用程序因内存不足错误而崩溃。
PS: 运行 在相同的嵌入式 Derby 数据库上的这个精确查询需要大约 5 分钟,但最终 returns 并且 DBeaver 中的内存使用量保持在 ~400mb 左右。
所有更新的行都加载到内存中直到提交。您可以根据主键和 LIMIT 子句分块更新。例如:
UPDATE TABLE_NAME SET COLUMN1= 0 WHERE COLUMN1 != 0 AND (PK_ID > 1000000 AND PK_ID < 2000000) LIMIT 1000000
上面的语句显示了两种不同的限制行的技术。首先,通过使用索引列来限制;其次,在更新多行后使用 LIMIT 停止更新。
http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_update_statement
我正在使用 HSQLDB 2.4.1(嵌入了缓存表)。我有一个大型数据库(约 2100 万行。数据库大小为 5GB) 我正在尝试 运行 以下查询:
UPDATE TABLE_NAME SET COLUMN1=0
我尝试更改和使用这些属性,但最终此更新语句消耗了大量 ram,就好像它正在将整个数据库复制到内存中一样。
properties.setProperty("hsqldb.large_data" , "true");
properties.setProperty("hsqldb.log_data" , "false");
properties.setProperty("hsqldb.default_table_type" , "cached");
properties.setProperty("hsqldb.result_max_memory_rows" , "50000");
properties.setProperty("hsqldb.tx" , "mvcc");
properties.setProperty("sql.enforce_tdc_update" , "false");
properties.setProperty("shutdown" , "true");
properties.setProperty("runtime.gc_interval" , "100000");
当我在 DBeaver 中执行此查询时,我注意到内存消耗显着增加并一直增加,直到达到 4GB 的最大内存,此时应用程序因内存不足错误而崩溃。
PS: 运行 在相同的嵌入式 Derby 数据库上的这个精确查询需要大约 5 分钟,但最终 returns 并且 DBeaver 中的内存使用量保持在 ~400mb 左右。
所有更新的行都加载到内存中直到提交。您可以根据主键和 LIMIT 子句分块更新。例如:
UPDATE TABLE_NAME SET COLUMN1= 0 WHERE COLUMN1 != 0 AND (PK_ID > 1000000 AND PK_ID < 2000000) LIMIT 1000000
上面的语句显示了两种不同的限制行的技术。首先,通过使用索引列来限制;其次,在更新多行后使用 LIMIT 停止更新。
http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_update_statement