Kolektor śmieci Firebird 2.0
Silnik wie o każdej wersji rekordów utworzonej przez instrukcję UPDATE\DELETE i może je usunąć, gdy tylko pozwoli na to najstarsza aktywna transakcja migawki (OST). Eliminuje to konieczność ponownego odczytu stron z tymi wersjami na żądanie użytkownika (np. SELECT COUNT(*) FROM table) i zapobiega sytuacji, w której te wersje nigdy nie są odczytywane (oczywiście sweep zawsze usuwał wszystkie nieużywane wersje rekordów). Istnieje również duże prawdopodobieństwo, że potrzebne strony nadal znajdują się w buforze, co zmniejsza dodatkowe operacje wejścia/wyjścia na dysku.
Pomiędzy powiadomieniem garbage collectora o stronie z nieużywanymi wersjami a momentem, w którym garbage collector odczyta tę stronę, nowa transakcja może zaktualizować rekord i garbage collector nie będzie mógł wyczyścić tego rekordu, jeśli numer tej nowej transakcji jest wyższy niż OST lub transakcja jest nadal aktywna. W takim przypadku silnik ponownie powiadamia garbage collector o numerze tej strony, a ten usunie śmieci później (stary garbage collector “zapomni” o tej stronie, dopóki użytkownik jej ponownie nie odczyta).
Możliwe jest teraz zarówno kooperatywne, jak i tło zbieranie śmieci. Aby to zarządzać, wprowadzono nowy parametr konfiguracyjny “GCPolicy”. Można go ustawić na:
-
a) cooperative - zbieranie śmieci wykonywane tylko w trybie kooperatywnym, tak jak przed IB6. Każde żądanie użytkownika odpowiada za usuwanie nieużywanych wersji rekordów. Tak działa silnik przed IB6. To jedyna opcja dla trybu Classic Server. Silnik nie śledzi wersji utworzonych w wyniku instrukcji UPDATE i DELETE
-
b) background - zbieranie śmieci wykonywane tylko przez wątek w tle, tak jak w IB6 i nowszych. Żadne żądania użytkownika nie usuwają nieużywanych wersji rekordów. Zamiast tego żądanie użytkownika powiadamia dedykowany wątek garbage collectora o numerze strony, na której wykryto nieużywaną wersję rekordu. Silnik zapamiętuje również numery stron, na których instrukcja UPDATE\DELETE utworzyła wersje wsteczne.
-
c) combined - wykonywane jest zarówno tło, jak i kooperatywne zbieranie śmieci.
Domyślnie ustawiona jest wartość “combined” dla SuperServer. ClassicServer ignoruje ten parametr i zawsze działa w trybie “cooperative”.