Ta strona została przetłumaczona maszynowo. Przeczytaj oryginał angielski. English

Biblioteka IBSurgeon

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!):

Code
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