SQL到H2迁移是否会解决HSQLDB中未使用空间的问题?

时间:2014-07-07 10:26:52

标签: hibernate hsqldb h2

我们在文件模式下有hibernate-hsql组合。在生产中,我们发现.lob文件正在增长,现在它的大小约为2.5GB。我们手动检查了数据内容,它只有2 MB。

经过几个hsql论坛后,我们注意到即使删除clob记录后也不会从.lob文件中回收空间。这就是为什么.lob文件大小不断增加,最终备份时间过长的原因。

这是迁移到H2的原因。这会解决问题吗?

2 个答案:

答案 0 :(得分:1)

如果您的应用程序使用了lobs并删除了其中一些,则该空间将重复用于将来的lobs。

在正常的应用程序使用中,DELETE语句用于删除行。该语句解除分配高空空间以供重用。

您可以以重新创建数据库的方式设计测试,而不是在删除数据后重用旧数据库。但这将是如此昂贵。所以HSQL没办法。

我不太了解H2,当我说Delete时,如果在H2中有一些机制不仅要解除空间而且还要对文件进行物理删除(IO),那么迁移将有助于你。

请详细回答此链接HSQLDB and .lobs file size以及如果您回答最后的评论,您会找到答案。

答案 1 :(得分:1)

在每个CHECKPOINT之后回收HSQLDB的.lob文件文件的空间。然后将回收的空间用于新的空间。

生产服务器只插入一次大量的lobs是不正常的,在删除旧数据后不添加更多。因此,此架构适用于大多数用例。

您可以在存储非常少的数据时清除.lobs文件。

  1. 使用ALTER TABLE t ALTER COLUMN c SET DATA TYPE将所有CLOB和BLOB列的类型更改为VARCHAR(100000000)。
  2. 关闭数据库并删除.lobs文件。
  3. 打开数据库并使用ALTER TABLE t ALTER COLUMN c SET DATA TYPE将类型更改回CLOB或BLOB。
  4. HSQLDB与大多数其他开源数据库不同,因为它有一个专用的lobs文件。 lobs的管理与普通数据是分开的,因为大的lob数据不会影响对非lob列的较小数据的访问。您还可以将lobs压缩与较小的LOB SCALE一起使用,以减少其存储空间,而不会影响正常数据。

相关问题