我有一个应用程序,它的 HSQL 数据库对于某些用户来说变得非常大,但对其他用户则不然。当我收到一个发生这个问题的例子时,我发现数据库几乎是空的——它几乎是 16GB 的零,只有几十兆字节的真实数据。在执行CHECKPOINT DEFRAG
时,它会缩小到真实的小尺寸。
不幸的是,我对这个数据库引擎不是很熟悉,而且我的在线搜索也没有产生什么有用的信息。一件有趣的事情是,有一个选项可以在达到一定大小时自动执行碎片整理,我没有使用过。但是,我希望数据库重用死行而不是保留它们,并且绝对不会将其清零,因为这肯定会对性能产生不良影响。
为什么数据库不断产生如此多的空白空间,这些空间只是被零散的数据打断?我怎样才能知道发生了什么?
一种解释是创建了很多行数据但后来被应用程序删除的情况。如果这些行碰巧始终在内存缓存中,则它们永远不会写入磁盘。
已删除行的空间最多可用于 500 个最近的项目,其余的将被丢弃。
有时可以使用 CHECKPOINT DEFRAG 命令来压缩具有大量空白空间的数据库。
数据库引擎不写入零。当一些文件空间被分配使用时,文件中的零就在那里。