Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
Шрифт:
Если новая транзакция является транзакцией SNAPSHOT, она будет иметь свою собственную копию TSB для поддержания согласованного вида состояния базы данных, каким он был при ее старте. Транзакция READ COMMITTED всегда обращается к самому последнему "глобальному" TSB для получения доступа к версиям, подтвержденным после ее старта.
Рис. 25.2. Взаимодействие процесса клиент-сервер с TSB
Условия для изменения OIT и OAT
Каждый
Значение OAT будет увеличиваться, если транзакции будут достаточно короткими, чтобы предохранять активные транзакции и мусор от самых новых транзакций - от нагромождения, OIT будет увеличиваться, пока клиентские процессы подтверждают свою работу в большей степени, нежели отменяют их или теряют в результате аварий. При этих условиях производительность базы данных будет хорошей.
Застрявшая OAT хуже, чем застрявшая OIT. В системе с хорошей производительностью разница между OAT и самой новой транзакцией должна приблизительно равняться
количеству запущенных клиентских процессов, умноженному на среднее количество выполняющихся транзакций в каждом процессе. Выполняйте чистку базы данных во внерабочее время или используйте автоматическую чистку или оба варианта.
В главе 27 вы найдете несколько стратегий клиентских приложений для оптимизации OIT и OAT.
"Зазор" - еще одна часть Firebird. Он означает разницу между OIT и OAT. Зазор будет небольшим в сравнении с общим количеством транзакций или, в идеале, нулем. При этих условиях разумно предположить, что не существует подвешенных транзакций, что привело бы к раздуванию TSB и большому разрастанию инвентарных страниц транзакций.
Собственно сам зазор не ухудшает производительность. Зазор является индикатором большого объема накладных расходов, добавляемых системой управления транзакциями к обработке базы данных - чрезмерное использование и фрагментация памяти, избыточное количество читаемых страниц в процессе поиска и выделяемых страниц в процессе изменения и добавления данных. Решение и устранение проблем ухудшения производительности заключается в уменьшении зазора.
Чистка в сравнении со сборкой мусора
Сборка мусора (Garbage Collection, GB) - это постоянный фоновый процесс, который является функцией нормальной деятельности по поиску записей и проверке версий записей, которая выполняется для каждой транзакции. Когда обнаруживается устаревшая версия записи с идентификатором меньшим, чем OAT, происходит одно из двух:
* для Классического сервера устаревшие версии записей удаляются немедленно. Это называется кооперативной сборкой мусора, потому что каждая транзакция и каждый экземпляр сервера участвуют в чистке мусора, опережая все другие;
* для Суперсервера устаревшие версии записей помечаются во внутреннем списке удаляемых элементов для потока сборки мусора. Когда поток сборки мусора "просыпается", он будет работать с элементами в этом списке, изменяя его.
Чистка (sweep) также выполняет эту задачу, но в отличие от сборки мусора она может иметь дело с одной категорией заинтересованных транзакций: с теми, которые имеют состояние "отмененные" (rolled back). Она может также удалить "остатки" удаленных записей и
Зазор является важным для автоматической чистки, потому что установленный для базы данных интервал чистки (sweeping interval) управляет максимальной величиной зазора, при достижении которого стартует процесс чистки [94] . Автоматическая чистка выполняется редко или никогда не выполняется для некоторых баз данных, потому что зазор не достигает порогового значения.
По умолчанию каждая база данных создается с интервалом чистки (максимальной величиной зазора) в 20 000. При необходимости эта величина может быть увеличена или уменьшена, или же чистка совсем может быть отключена при установке величины интервала в 0.
94
Во всех версиях Firebird и в InterBase до версии 7.1 sweep срабатывает, когда расстояние между OIT и Oldest Snapshot Transaction (а не OAT) становится больше sweep interval (см. разд. "Другие переключатели gstat" главы 18). В Firebird 2.0 срабатывание sweep будет зависеть именно от разницы OAT-OIT.
– Прим. науч. ред.
В системе, где зазор всегда меньше интервала чистки, не является справедливым, что для базы данных никогда не требуется чистка. Все базы данных должны вычищаться - это вопрос управления базами данных человеком, будут ли они чиститься автоматически, вручную с использованием 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] .
95
OST - это на самом деле номер транзакции, которая была активной на момент старта OAT.
– Прим. науч. ред.