firebird 中的 Blob 存储增加了数据库文件的大小
Blob storage in firebird increases database file size
我必须使用 Firebird 将文件数据存储在 blob 字段中。每次执行查询时,数据库文件的大小都会增加,即使使用相同的参数执行也是如此。
是否可以避免这个问题?
update or insert into FILES(FILENAME, FILEVERSION, SHA512, FILESTATUS, FILEDATA)
values(''%s'', ''%s'', ''%s'', %d, :FILEDATA)
matching (FILENAME, FILEVERSION)
编辑:
抱歉,我没有详细说明问题,我找到了一个解决方法:第一个查询检查文件数据是否已经存储,第二个查询只有在没有存储的情况下才执行。我认为,它可以组合在 'execute block' 语句中。
在对各种版本进行一些测试后,重现此行为的唯一方法是如果垃圾收集被 long-运行ning 事务抑制。这意味着当您 运行ning 那些 update or insert
语句时,另一个事务正在同时 运行ning,阻止垃圾收集器清理这些 blob。
有趣的是,当在单个事务中 运行 多个 update or insert
语句而另一个事务并行 运行 时,数据库不会增长。这似乎表明在同一个事务中,blob 的 space 被重用。
此问题似乎已在 Firebird 4 中修复(已通过快照 4.0.0.1641 进行检查),但此 Firebird 版本仍在开发中。
在 Firebird 3 及更早版本中,solution/workaround 将确保您的数据库中没有长时间 运行ning 事务阻止垃圾收集,或者尝试 运行 尽可能在单个事务中进行这些更新。
我必须使用 Firebird 将文件数据存储在 blob 字段中。每次执行查询时,数据库文件的大小都会增加,即使使用相同的参数执行也是如此。
是否可以避免这个问题?
update or insert into FILES(FILENAME, FILEVERSION, SHA512, FILESTATUS, FILEDATA)
values(''%s'', ''%s'', ''%s'', %d, :FILEDATA)
matching (FILENAME, FILEVERSION)
编辑: 抱歉,我没有详细说明问题,我找到了一个解决方法:第一个查询检查文件数据是否已经存储,第二个查询只有在没有存储的情况下才执行。我认为,它可以组合在 'execute block' 语句中。
在对各种版本进行一些测试后,重现此行为的唯一方法是如果垃圾收集被 long-运行ning 事务抑制。这意味着当您 运行ning 那些 update or insert
语句时,另一个事务正在同时 运行ning,阻止垃圾收集器清理这些 blob。
有趣的是,当在单个事务中 运行 多个 update or insert
语句而另一个事务并行 运行 时,数据库不会增长。这似乎表明在同一个事务中,blob 的 space 被重用。
此问题似乎已在 Firebird 4 中修复(已通过快照 4.0.0.1641 进行检查),但此 Firebird 版本仍在开发中。
在 Firebird 3 及更早版本中,solution/workaround 将确保您的数据库中没有长时间 运行ning 事务阻止垃圾收集,或者尝试 运行 尽可能在单个事务中进行这些更新。