firebird中的Blob存储会增加数据库文件的大小

问题描述 投票:1回答:1

我必须使用Firebird将文件数据存储在Blob字段中。每次执行查询时,即使使用相同的参数执行,数据库文件的大小也会增加。

是否有可能避免这个问题?

update or insert into FILES(FILENAME, FILEVERSION, SHA512, FILESTATUS, FILEDATA)
  values(''%s'', ''%s'', ''%s'', %d, :FILEDATA)
  matching (FILENAME, FILEVERSION)

编辑:抱歉,我没有详细说明问题,但找到了解决方法:第一个查询检查文件数据是否已存储,第二个查询仅在未存储时执行。我认为,可以将其合并为“执行块”语句。

blob firebird firebird2.5
1个回答
0
投票

经过各种版本的测试后,重现此行为的唯一方法是,长时间运行的事务禁止垃圾回收。这意味着,当您运行这些update or insert语句时,另一个事务正在同时运行,从而阻止了垃圾收集器清理这些blob。

有趣的是,当在另一个事务中并行运行单个事务中运行多个update or insert语句时,数据库不会增长。这似乎表明在同一事务中,blob的空间已被重用。

[此问题似乎已在Firebird 4中解决(已通过快照4.0.0.1641进行检查),但是此Firebird版本仍在开发中。

在Firebird 3及更早版本中,解决方案/解决方法是确保数据库上没有长时间运行的事务来防止垃圾收集,或者尝试在单个事务中尽可能多地运行这些更新。

© www.soinside.com 2019 - 2024. All rights reserved.