如何用临时BLOB“膨胀”Firebird数据库
这是一篇“不要这样做”的文章–仅作为示例。如果你发现Firebird数据库异常增长,请检查你是否编写了使用BLOB拼接的存储过程、触发器或execute block。
在某些情况下,Firebird会将临时BLOB存储在数据库文件内部,因此数据库会非常快速地增长。
这个问题已在HQbird中修复,在HQbird中,临时BLOB可以被发送到临时文件夹,而不是数据库本身。
以下示例演示了该问题:它创建了大量小的临时BLOB,这些BLOB存储在数据库文件中,因此会使Firebird数据库“膨胀”约2GB(请小心,不要在生产环境或重要数据库上运行它!):
execute block
returns (
BLB blob)
as
declare BLB1 blob;
declare I integer;
begin
I = 0;
BLB = 'blabla';
BLB1 = cast('blablablablablablablablablablablablablabla' as blob);
while (I < 10000) do
begin
BLB = BLB || BLB1;
I = I + 1;
end
suspend;
end
Firebird会保留临时BLOB,直到事务提交(或回滚)。如果你提交事务然后再次运行代码,你会注意到数据库文件不会增长–这是因为数据库内部用于临时BLOB的空间会被重用。
在我们的Telegram频道上关注Firebird Friday Jokes:https://t.me/firebirdsql