Cómo "inflar" una base de datos Firebird con blobs temporales
Este es uno de los artículos de “no hagas esto”, solo como ejemplo. Si encuentras un crecimiento anormal de tu base de datos Firebird, verifica que no hayas escrito un procedimiento almacenado, disparador o bloque de ejecución que use concatenación de BLOBs.
En algunos casos, Firebird almacena BLOBs temporales dentro del archivo de la base de datos, por lo que crece muy, muy rápido.
Este problema está solucionado en HQbird, donde los BLOBs temporales pueden enviarse a una carpeta temporal en lugar de a la propia base de datos.
El siguiente ejemplo demuestra el problema: crea muchos BLOBs temporales pequeños, que se almacenan en el archivo de la base de datos, por lo que “inflará” la base de datos Firebird en ~2Gb (¡Ten cuidado y no lo ejecutes en bases de datos de producción o importantes!):
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 mantiene los BLOBs temporales hasta el commit (o rollback) de la transacción. Si confirmas la transacción y luego ejecutas el código nuevamente, notarás que el archivo de la base de datos no crecerá; esto se debe a que el espacio para BLOBs temporales dentro de la base de datos se reutiliza.
Sigue los chistes de Firebird Friday en nuestro canal de Telegram: https://t.me/firebirdsql