Firebird 2.0 збирач сміття
Движок знає про кожну версію запису, створену оператором update\delete, і може видаляти їх, щойно найстаріша транзакція знімка (OST) це дозволить. Це усуває необхідність повторного читання сторінок із цими версіями за запитом користувача (тобто SELECT COUNT(*) FROM table) і уникає ситуації, коли ці версії ніколи не читаються (звісно, sweep завжди видаляв усі невикористані версії записів). Також існує висока ймовірність, що потрібні сторінки все ще перебувають у буферному кеші, тому потрібно менше додаткових операцій введення-виведення з диском.
Між моментом сповіщення збирача сміття про сторінку з невикористаними версіями та моментом, коли збирач сміття прочитає цю сторінку, нова транзакція може оновити запис, і збирач сміття не зможе очистити цей запис, якщо номер нової транзакції вищий за OST або вона все ще активна. У цьому випадку движок знову сповіщає збирача сміття про номер цієї сторінки, і він очистить сміття пізніше (старий збирач сміття “забуде” про цю сторінку, доки користувач не прочитає її знову).
Тепер можливі як кооперативне, так і фонове збирання сміття. Для керування цим було введено новий параметр конфігурації “GCPolicy”. Він може бути встановлений на:
-
a) cooperative - збирання сміття виконується лише в кооперативному режимі, як до IB6. Кожен запит користувача відповідає за видалення невикористаних версій записів. Так движок працював до IB6. Це єдиний варіант для режиму Classic Server. Движок не відстежує версії, створені в результаті операторів update та delete
-
b) background - збирання сміття виконується лише фоновим потоком, як у IB6 і пізніших версіях. Жодні запити користувача не видаляють невикористані версії записів. Натомість запит користувача сповіщає виділений потік збирача сміття про номер сторінки, де виявлено невикористану версію запису. Також движок запам’ятовує номери сторінок, де оператор update\delete створив бекверсії.
-
c) combined - виконуються як фонове, так і кооперативне збирання сміття.
За замовчуванням для SuperServer встановлено “combined”. ClassicServer ігнорує цей параметр і завжди працює в режимі “cooperative”