"Зазор" - еще одна часть Firebird. Он означает разницу между OIT и OAT. Зазор будет небольшим в сравнении с общим количеством транзакций или, в идеале, нулем. При этих условиях разумно предположить, что не существует подвешенных транзакций, что привело бы к раздуванию TSB и большому разрастанию инвентарных страниц транзакций.
Собственно сам зазор не ухудшает производительность. Зазор является индикатором большого объема накладных расходов, добавляемых системой управления транзакциями к обработке базы данных - чрезмерное использование и фрагментация памяти, избыточное количество читаемых страниц в процессе поиска и выделяемых страниц в процессе изменения и добавления данных. Решение и устранение проблем ухудшения производительности заключается в уменьшении зазора.
Чистка в сравнении со сборкой мусора
Сборка мусора (Garbage Collection, GB) - это постоянный фоновый процесс, который является функцией нормальной деятельности по поиску записей и проверке версий записей, которая выполняется для каждой транзакции. Когда обнаруживается устаревшая версия записи с идентификатором меньшим, чем OAT, происходит одно из двух:
* для Классического сервера устаревшие версии записей удаляются немедленно. Это называется кооперативной сборкой мусора, потому что каждая транзакция и каждый экземпляр сервера участвуют в чистке мусора, опережая все другие;
* для Суперсервера устаревшие версии записей помечаются во внутреннем списке удаляемых элементов для потока сборки мусора. Когда поток сборки мусора "просыпается", он будет работать с элементами в этом списке, изменяя его.
Чистка (sweep) также выполняет эту задачу, но в отличие от сборки мусора она может иметь дело с одной категорией заинтересованных транзакций: с теми, которые имеют состояние "отмененные" (rolled back). Она может также удалить "остатки" удаленных записей и освободить память для повторного использования.
Зазор является важным для автоматической чистки, потому что установленный для базы данных интервал чистки (sweeping interval) управляет максимальной величиной зазора, при достижении которого стартует процесс чистки[94]. Автоматическая чистка выполняется редко или никогда не выполняется для некоторых баз данных, потому что зазор не достигает порогового значения.
По умолчанию каждая база данных создается с интервалом чистки (максимальной величиной зазора) в 20 000. При необходимости эта величина может быть увеличена или уменьшена, или же чистка совсем может быть отключена при установке величины интервала в 0.
В системе, где зазор всегда меньше интервала чистки, не является справедливым, что для базы данных никогда не требуется чистка. Все базы данных должны вычищаться - это вопрос управления базами данных человеком, будут ли они чиститься автоматически, вручную с использованием gfix или обоими способами. Думайте об автоматической чистке как о системе стабильного функционирования, а не как о заменителе удобного управления базой данных.
Статистика транзакций
В Firebird есть несколько полезных утилит для получения сведений о том, насколько хорошо ваша база данных управляет зазором между OIT и OAT. Их вы можете также использовать для просмотра значений в заголовочной странице базы данных.
gstat
Инструмент командной строки gstat, используемый с переключателем -header, показывает различную статистическую информацию базы данных, включая текущее значение идентификатора транзакции для OIT, OAT и для следующей новой транзакции. Для использования gstat соединитесь с базой данных как пользователь SYSDBA из командной строки на главной машине и перейдите в каталог bin Firebird. Наберите следующий текст в Windows:
gstat -h <путь-к-базе-данных> -user sysdba -password masterkey
Наберите в POSIX:
./gstat -h <путь-к-базе-данных> -user sysdba -password masterkey
Вот фрагмент выходных данных:
Oldest transaction 10075
Oldest active 100152
Oldest snapshot 100152
Next transaction 100153
Терминология в этом отчете может вызвать удивление. При просмотре выхода gstat имейте в виду, что:
* Oldest transaction - это OIT;
* Oldest active - очевидно, OAT;
* oldest snapshot- обычно то же, что и OAT- строка будет выведена, когда OAT продвигается далее. Это фактический идентификатор транзакции, рассматриваемый сборщиком мусора как сигнал существования мусора, который может быть обработан[95].
isql
Вы можете получить похожий вид статистики из заголовка базы данных в сессии isql при использовании команды SHOW DATABASE.
Многие инструменты администратора Firebird сторонних разработчиков создают эквивалентные отчеты.
Что может рассказать вам статистика
Сборка мусора всегда будет выполняться над устаревшими версиями записей, не трогая заинтересованные транзакции. При этом OLDEST SNAPSHOT отмечает границы, на которых сборщик мусора останавливает просмотр подтвержденных транзакций. Любой мусор с такого номера транзакции и выше не будет обрабатываться.