Выбрать главу

Работа с неконтролируемым индексом, который ухудшается по мере роста таблицы до того, как он начинает влиять на планы запросов, является важной частью настрой- ки базы данных. При этом большинство критических эффектов использования индекса с фактически низкой селективностью практически не влияют на оптимизатор и оказывают сильное воздействие на геометрию индекса[57].

Почему низкая селективность наносит ущерб

Для индексов Firebird создает двоичное дерево. Он хранит эти структуры на индексных страницах, которые выделяются только для хранения индексных деревьев. Каждое значение в сегменте индекса имеет собственный узел за пределами корня дерева. Когда в индекс добавляется новая запись, она или помещается в новый узел, если ее значение не существует в индексе, или помещается в начало стека существующих дубликатов значений.

Рис. 18.2 иллюстрирует этот двоичный механизм в простейшей форме

Когда появляются дублирующие значения, они помещаются в первый узел в начало "цепи" других дубликатов - это то, что происходит со значением ghi на нашей диаграмме. Такая структура называется цепочкой дубликатов.

Цепочки дубликатов[58]

Цепочка дубликатов сама по себе является замечательной - все неуникальные индексы имеют ее. Изменение сегмента значения или удаление строки является дорого- стоящим, если цепочка дубликатов очень длинная. Одно из самого плохого, что вы можете сделать в базе данных Firebird - определить таблицу с миллионом строк, каждая из которых имеет одно и то же значение ключа для вторичного индекса, а затем удалить все эти строки. Последний сохраненный дубликат появляется в начале списка, а первый сохраненный дубликат - в конце. Обычно удаление начинается с первой сохраненной строки, затем удаляется вторая и т.д. Код обработки индекса будет проходить через всю цепь дубликатов для каждого удаления, всегда отыскивая нужную запись в самой последней позиции. Цитата Ann Harrison: "Это перемешивает кэш так, как вы никогда не видели".

Затраты на все такие "перемешивания" и "взбалтывания" никогда не связаны с транзакцией, которая удаляет или изменяет все строки в таблице. Изменение значения ключа или его удаление влияет на индекс позже, когда старые версии будут включены в процесс сборки мусора. Затраты проявятся для следующей транзакции, обращающейся к этим строкам и выполняющейся после завершения всех транзакций, которые были активны, когда выполнялось изменение или удаление[59].

Инструментарий для индекса

Стандартная поставка Firebird содержит множество инструментов и приемов для получения состояния индексов и поддержания их в хорошей форме.

* Для получения значения селективности и других значимых характеристик индексов используйте анализатор статистики данных gstat. Позже в этой главе мы рассмотрим, как gstat может рассказать вам о ваших индексах.

* Инструментом для пересчета селективности индекса является оператор SET STATISTICS (обсуждаемый в следующем разделе), SET STATISTICS не пересоздает индекс.

* Лучшей из всех инструментов для чистки индексов является утилита резервного копирования и восстановления gbak. Восстановление базы данных из самой последней резервной копии пересоздает все индексы и заново вычисляет их селективность.

Использование SET STATISTICS

В некоторых таблицах количество дублирующих значений в индексированных столбцах может радикально увеличиваться или уменьшаться как результат относительной "популярности" отдельных значений в индексе по сравнению с другими кандидатами в значения. Например, индексы по датам в системе продаж могут иметь тенденцию становиться менее селективными при резком увеличении деловой активности.

Периодическое вычисление селективности индекса может увеличить производительность индексов, которые являются субъектами значительных изменений в распределении различных значений.

Оператор SET STATISTICS заново вычисляет селективность индекса. Этот оператор может быть выполнен в интерактивной сессии isql или запущен в приложении ESQL. Для выполнения оператора SET STATISTICS вы должны быть соединены с базой данных как пользователь, создавший индекс, как пользователь SYSDBA или (в POSIX) как пользователь с привилегиями операционной системы root.

Синтаксис:

SET STATISTICS INDEX ИМЯ;

Следующий оператор заново вычисляет селективность индекса в базе данных employee.gdb:

SET STATISTICS INDEX MINSALX;

Сам по себе оператор SET STATISTICS не решает текущие проблемы, являющиеся результатом предыдущего использования индекса, которые связаны с устаревшей статистикой селективности, потому что он не пересоздает индекс.

! ! !

СОВЕТ. Для пересоздания индекса используйте ALTER INDEX, или удалите и заново создайте его, или восстановите базу данных с резервной копии.

. ! .

Получение статистики по индексу

Firebird предоставляет утилиту командной строки, которая отображает статистические отчеты о состоянии объектов в базе данных. Этот инструмент создает множество отчетов о том, что происходит в базе данных. Основное внимание в этом разделе мы уделяем статистике по индексу. Остальные отчеты описываются после отчетов по индексу.

Инструмент командной строки gstat

Вам нужно запускать gstat на серверной машине, потому что это полностью локальная программа, которая не имеет доступа к базам данных как клиент. Ее размещение по умолчанию - каталог /bin в вашем каталоге инсталляции Firebird. Она выдает информацию об указанной базе данных и может быть использована SYSDBA или владельцем базы данных.

gstat в POSIX

Поскольку gstat обращается к файлам базы данных на уровне файловой системы, на платформах Linux и UNIX необходимо на уровне системы иметь доступ на чтение к этим файлам. Вы можете его получить одним из следующих способов.

* Соединитесь с той учетной записью, под которой выполняется сервер (по умолчанию пользователь firebird в версии 1.5, root или interbase в версии 1.0.x).

* Установите разрешение на чтение для вашей группы к файлу базы данных.

Интерфейс gstat

В отличие от некоторых других инструментов командной строки gstat не имеет своего интерфейса командной строки. Каждый запрос заключается в вызове gstat с переключателями.

Синтаксис:

gstat [переключатели] имя-базы-данных

где имя-базы-данных- полный путь к базе данных.

Графические инструменты

gstat не является дружественным пользователю инструментом. Некоторые графические инструменты (например, IBAnalyst) четко выполняют ту же работу gstat по выводу результатов, используя Services API. Формы экранов были взяты из утилиты с открытыми кодами IBOConsole[60].

Переключатели

В табл. 18.1 описаны переключатели gstat.

Таблица 18.1. Переключатели gstat

Переключатель

Описание

-user имя-пользователя

Проверяет имя пользователя перед доступом к базе данных

-pa[ssword] пароль

Проверяет пароль перед доступом к базе данных

-header

Выводит информацию заголовочной страницы, затем прекращает работу

-log

Выводит информацию заголовочной страницы и страницы протокола, затем прекращает работу

-index

Отыскивает и отображает статистику по индексам базы данных

-data

Отыскивает и отображает статистику по таблицам пользователя базы данных

-all

Это значение по умолчанию, если вы не запросили -index, -data или -all. Отыскивает и отображает статистику по -index и-data

вернуться

57

На оптимизатор в основном влияет то, что с течением времени если индекс меняется (меняются индексируемые данные), то статистика индекса остается неизменной, т. к. она меняется только вручную вызовом оператора SET STATISTICS. Поэтому вместо рекомендуемого здесь периодического пересоздания индексов лучше озаботиться регулярным пересчетом статистики индексов. - Прим. науч. ред.

вернуться

58

В этом месте разговор идет со слов Ann Harrison, "матери InterBase".

вернуться

59

Сборка мусора в больших цепочках дубликатов ключей значительно ускорена в Firebird 2.0. Собственно, в Firebird 2.0 изменена структура индексов. - Прим. науч. ред.

вернуться

60

IBOConsole поддерживает Lorenzo Mengoni - см. http://www.mengoni.it.