Jak "napompować" bazę danych Firebird tymczasowymi obiektami blob
To jest jeden z artykułów typu „nie rób tego” - tylko jako przykład. Jeśli zauważysz nienaturalny wzrost rozmiaru swojej bazy danych Firebird, sprawdź, czy nie napisałeś procedury składowanej, wyzwalacza lub bloku execute, który używa konkatenacji BLOB-ów.
W niektórych przypadkach Firebird przechowuje tymczasowe BLOB-y wewnątrz pliku bazy danych, przez co rośnie on bardzo, bardzo szybko.
Ten problem został rozwiązany w HQbird, gdzie tymczasowe BLOB-y mogą być wysyłane do folderu tymczasowego zamiast do samej bazy danych.
Poniższy przykład pokazuje problem: tworzy on wiele małych tymczasowych BLOB-ów, które są przechowywane w pliku bazy danych, przez co „nadmuchuje” bazę Firebird o około 2 GB (bądź ostrożny i nie uruchamiaj tego na produkcji ani na ważnych bazach danych!):
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 przechowuje tymczasowe BLOB-y do momentu zatwierdzenia (commit) lub wycofania (rollback) transakcji. Jeśli zatwierdzisz transakcję, a następnie uruchomisz kod ponownie, zauważysz, że plik bazy danych nie urośnie - wynika to z faktu, że miejsce na tymczasowe BLOB-y wewnątrz bazy jest ponownie wykorzystywane.
Śledź Firebird Friday Jokes na naszym kanale Telegram: https://t.me/firebirdsql