Шрифт:
Однако, если проектирование базы данных, безусловно, требует ограничений внешних ключей для временных таблиц со столбцами низкой селективности, существуют рекомендованные способы уменьшения накладных расходов и снижения ухудшения состояния индексных страниц, являющихся следствием удаления и дальнейшего наполнения данными таблицы. Отслеживайте уровень заполнения проблемных индексов и принимайте меры, когда он упадет ниже 40%. Выбор действий зависит от ваших требований.
* Если возможно, удаляйте все строки за один раз, а не выполняйте их удаление одну за другой в случайном порядке. Удалите ограничение внешнего ключа, удалите строки и подтвердите транзакцию. Заново создайте ограничение. Поскольку это не длинная транзакция, задерживающая сборку мусора, новый индекс будет полностью пустым.
* Если удаления должны быть последовательными, выберите время, чтобы получить исключительный доступ и использовать ALTER INDEX для пересоздания индекса. Это будет более быстро и предсказуемо, чем инкрементная сборка мусора в огромной цепочке дубликатов.
Другие переключатели gstat
Статистика утилиты gstat может предоставить полезную информацию о других действиях с базой данных.
Эта строка
gstat -header база-данных
отображает суммарную информацию заголовочной страницы базы данных. На рис. 18.5 показан пример.
Первая строка отображает имя и размещение первичного файла базы данных. Следующие строки содержат информацию из заголовочной страницы базы данных. В табл. 18.3 описывается этот вывод.
Рис. 18.5. Пример вывода заголовочной страницы утилитой gstat
Таблица 18.3. Вывод gstat -h[eader]
Элемент | Описание |
Flags | Флаги |
Checksum | Контрольная сумма заголовочной страницы. В прототипе (InterBase) это было уникальное значение, вычислявшееся по всем данным заголовочной страницы. В Firebird это всегда 12 345. Когда заголовочная страница сохраняется на диске, а затем считывается, контрольная сумма найденной страницы сравнивается с 12 345, и если они не соответствуют, то вызывается ошибка контрольной суммы. Это перехватывает некоторые виды физического разрушения |
Generation | Каждый раз увеличивается на единицу, когда заголовочная страница записывается на диск |
Page size | Текущий размер страницы базы данных в байтах |
ODS version | Версия структуры на диске (ODS) для базы данных. Это будет 10 для версии 1,0.x и 10.1 для версии 1.5 |
Oldest transaction | Идентификатор самой старой "заинтересованной" транзакции. Информацию об этом см. в главе 25 |
Oldest active | Идентификатор самой старой активной транзакции |
Oldest snapshot | Идентификатор самой старой транзакции, которая не является в настоящий момент подходящей для сборки мусора (т. е. эта и другие, более поздние транзакции не являются для этого подходящими) |
Next transaction | Идентификатор, который Firebird назначит следующей транзакции. Разница между самой старой активной транзакцией и следующей транзакцией определяет, когда начнется чистка базы данных [61] . Значение по умолчанию 20 000. См. разд. "Гигиена базы данных" главы 15 |
Bumped transaction | Теперь устарело |
Sequence number | Последовательный номер заголовочной страницы. Всегда ноль |
Next connection ID | Номер идентификатора следующего соединения с базой данных |
Implementation ID | Архитектура аппаратуры, на которой была создана база данных |
Shadow count | Количество наборов оперативных копий для базы данных |
Number of cache buffers | Размер в страницах кэша базы данных. Ноль означает, что база данных использует значение по умолчанию сервера (DefaultDbCachePages в firebird.config, default_cache_pages в ibconfig/isc_config для версии 1.0.x) |
Next header page | Номер страницы следующей заголовочной страницы - хотя, похоже, это не поддерживается |
Database dialect | Диалект SQL базы данных |
Creation date | Дата создания базы данных или последнего восстановления из резервной копии |
Attributes | force write означает режим принудительной записи. no reserve указывает, что на страницах не резервируется место для старых версий данных. Это позволяет более плотно упаковывать данные на каждой странице, в силу чего база данных занимает меньше дискового пространства. Это идеал для баз данных только для чтения. shutdown означает, что работа с базой данных запрещена для всех пользователей, кроме SYSDBA |
Variable header data | Интервал очистки (sweep interval). Информация о вторичных файлах (если присутствуют) |
61
Это неверно, и автор подтвердил ошибку. Next transaction не имеет никакой связи со sweep. Автоматический sweep стартует, когда разница между Oldest Snapshot и Oldest Interesting больше Sweep interval (в Firebird 2.0 за верхнюю границу берется не Oldest Snapshot, a Oldest Active).
– Прим. науч. ред.
Следующая строка
gstat -data база-данных
просматривает в базе данных таблицу за таблицей, отображая итоговую информацию о страницах данных. Для включения в отчет системных таблиц (RDB$XXX) добавьте переключатель -system. На рис. 18.6 показан пример вывода.
Рис. 18.6. Пример итогового вывода по страницам данных в gstat
Вывод в командной строке аналогичен.
COUNTRY (31)
Primary pointer page: 190, Index root page: 19
Data pages: 1, data page slots: 1, average fill: 26%
Fill distribution:
0 - 19% = 0
20 - 39% = 1
40 - 59% = 0
60 - 79% = 0
80 - 99% = 0
Для каждой таблицы базы данных отображаются числа, показанные в табл. 18.4.
Глава 18. Индексы
375
Таблица 18.4. Вывод gstat -d[ata]
Элемент | Описание |
Primary pointer page | Номер первой страницы косвенных указателей на страницы, хранящие данные таблицы |
Index root page | Номер страницы, которая является первой страницей указателей на индексы таблицы |
Data pages | Общее количество страниц, в которых хранятся данные таблицы. Этот счетчик включает страницы, хранящие неподтвержденные версии записей и мусор, потому что gstat не может их отличить друг от друга |
Data page slots | Количество указателей на страницы базы данных, содержащихся на страницах указателей. Должно равняться числу страниц данных |
Average fill | Это гистограмма из пяти 20-процентных "полос", каждая из которых показывает количество страниц данных, чье среднее заполнение попадает в этот диапазон. Процент заполнения определяется соотношением пространства каждой страницы, содержащей данные. В нашем примере среднее заполнение низкое, потому что база данных employee.gdb содержит небольшие структуры записей, и их не так много. Сумма этих чисел дает общее количество страниц, содержащих данные |
Fill distribution | Обобщающая гистограмма распределения использования памяти для всех страниц, выделенных в таблице. В нашем примере пока используется только одна страница, и она имеет менее 40% заполнения |
Если вам не нужен отчет по данным для всех таблиц, вы можете использовать переключатель -t для задания списка таблиц, интересующих вас.
Синтаксис:
gstat -data база-данных -t имя-таблицы1 [имя-таблицы2 [ имя-таблицы3 ..]]
! ! !
ПРИМЕЧАНИЕ. Имена таблиц должны быть набраны в верхнем регистре. К сожалению, gstat не поддерживает переключатель -t[able-list] для баз данных, которые используют чувствительные к регистру идентификаторы таблиц, заключенные в кавычки.
. ! .
Следующая строка
gstat -r база-данных
отображает статистику по размерам и версиям записей.
* Для строк: среднее значение длины строк в байтах и общее количество строк в таблице.
* Для старых версий: среднее значение длины версий в байтах, общее количество версий в таблице и максимальная цепочка версий для записи.
Общее количество строк в таблице может включать активные и зависшие транзакции. Длина записей и версий применима к фактическим данным пользователя - длина не использует счетчик в заголовке, который предшествует каждой версии записи.