截断需要太多时间 hsqldb

Posted

技术标签:

【中文标题】截断需要太多时间 hsqldb【英文标题】:Truncating takes too much time hsqldb 【发布时间】:2015-03-21 08:48:10 【问题描述】:

我使用 HSQLDB 2.3.2,但遇到以下问题:

    我的数据库缓存了包含 10 000 000 条记录的表,没有任何约束和索引。它的大小约为~900mb。我关闭了自动提交模式,当我尝试执行“Truncate table tableName”时,执行挂起但只有 dbName.backup 正在增长。原因如下:

跟踪引擎:? - copyShadow [大小,时间] 2246252 9721 TRACE 引擎:? - setFileModified 标志集 TRACE ENGINE:? - 缓存保存 rows [count,time] 总计 24801,9921 操作 24801,9921 txts 96 跟踪引擎:? - copyShadow [大小,时间] 4426920 7732 TRACE 引擎:? - 缓存保存行 [count,time] 总计 49609,17775 次操作 24808,7854 txts 96 跟踪引擎:? - copyShadow [大小,时间] 6574796 9024

大约需要 1500-2000 秒,最后我可以得到空表或类似这样的异常:

Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,525.509 sec
org.apache.maven.surefire.util.SurefireReflectionException: java.lang.reflect.InvocationTargetException; nested exception is java.lang.reflect.InvocationTargetException: null
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164)
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110)
    at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175)
    at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:107)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:68)
Caused by: java.lang.OutOfMemoryError: Java heap space

删除截断的 dbName.backup 之后。我不必在我的应用程序中使用任何备份,如何避免复制?

    dbName.properties 不起作用。它包含以下文本:

    #HSQL 数据库引擎 2.3.2

    #Thu Mar 19 08:42:10 EAT 2015

    版本=2.3.2 修改=否

我试图追加hsqldb.applog=1,但什么也没发生。 dbName.app.log 出现以防您更改 dbName.script 中的SET DATABASE EVENT LOG LEVEL 1 行 从我的应用程序使用数据库后,dbName.properties 被覆盖:“yes”上的“modified”更改和下面的任何行都被删除。我做错了什么?

【问题讨论】:

【参考方案1】:

我的数据库缓存了包含 10 000 000 条记录的表,没有任何记录 约束和索引。

没有任何约束和索引的大表是完全错误的。此表上影响几行的任何 SELECT、UPDATE 或 DELETE 都必须搜索表中的所有行。

我尝试执行“Truncate table tableName”

上述语句允许您在提交之前回滚操作。回滚的信息存储在内存中,当表很大时内存会耗尽。如果您确实想提交更改,请改用以下语句:

TRUNCATE TABLE tableName AND COMMIT

指南中提到了这一点:http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_truncate_statement

您可以对 .properties 文件进行的唯一添加是将数据库文件设置为只读。任何其他更改都将被忽略并删除。

.backup 文件供数据库引擎内部使用,您不能停止使用。

【讨论】:

谢谢回答!你的陈述完全有效!顺便说一句,我稍后会添加约束,我现在不需要

以上是关于截断需要太多时间 hsqldb的主要内容,如果未能解决你的问题,请参考以下文章

hsqldb 数据异常:字符串数据,语句中右截断

为啥我的 HSQLDB 表在磁盘上占用了太多空间?

防止 sqlplus 截断列名,没有单独的列格式

UCanAccess:截断模式支持不起作用

HSQLDB 文件模式的快速切换替代方案(我现在需要并发访问)

hsqldb 忽略服务器上表上的第一个插入操作(服务器需要“预热”?)