Вход/Регистрация
Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
вернуться

Борри Хелен

Шрифт:

* Пересоздание индекса восстановит баланс его древовидной структуры за счет удаления устаревших записей, удаления и перемещения ветвей, созданных последовательными добавлениями данных. Инструментом для переключения индекса между активным и неактивным состояниями является оператор ALTER INDEX.

* Полное пересоздание индекса с нуля путем удаления и повторного создания в первоначальном виде может увеличить производительность индекса для очень большой или динамической таблицы.

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

Улучшение селективности индекса

Вообще говоря, селективность (избирательность) индекса - это оценочное количество строк, которые могут быть выбраны при поиске по каждому значению индекса. Уникальный индекс имеет максимально возможную селективность, потому что он не может выбрать более одной строки для каждого значения, в то время как индекс для столбца BOOLEAN имеет практически самую низкую селективность.

Индексирование столбца, который будет хранить преимущественно одно значение (например, страна рождения в предыдущем примере), будет худшим решением, чем не индексирование такого столбца совсем. Firebird достаточно эффективен при создании образа для неиндексированных сортировок и поисков.

Измерение селективности

Селективность уникального индекса равна I. Все неуникальные индексы имеют значение меньше 1. Селективность (s) вычисляется как [56]

s = n / количество строк в таблице

где n- количество различных экземпляров значения индекса в таблице. Чем меньше количество отличающихся экземпляров, тем меньше селективность. Индексы с более высокой селективностью выполняются лучше, чем индексы с низкой селективностью.

56

Изложенное понятие селективности обратно числам, реально используемым оптимизатором. Оптимизатор берет информацию о селективности из столбца RDB$STMTSTICS таблицы RDB$INDICES, который вычисляется по формуле 1/(число ключей - число повторяющихся ключей). Чем меньше это число, тем выше селективность индекса и тем полезнее он с точки зрения оптимизатора. Для уникальных индексов селективность стремится к нулю (зависит от числа ключей). Для неуникальных индексов худшим случаем является селективность, равная 1, когда все значения ключей идентичны.
– Прим. науч. ред.

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

Пересчет селективности

Пересчет селективности индекса изменяет статистический множитель, хранящийся в системных таблицах. Оптимизатор читает его один раз при выборе плана- он не является особенно значимым для его выбора. Часто большие операции DML не обязательно повреждают распределение различных значений ключа индекса. Если индексирование разумно, то "демография" распределения значений может изменяться очень незначительно.

Знание наиболее правильной селективности индекса имеет большое значение для разработчика. Это дает основу для определения полезности индекса.

Если эффективность плана со временем снижается по причине большого количества добавлений или изменений ключевого столбца (столбцов), которые изменяют распределение значений ключа, быстродействие запросов может постепенно снижаться. Любой индекс, чья селективность со временем резко падает, должен быть удален, потому что он влияет на производительность.

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

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

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

57

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

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

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

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

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

58

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

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

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

59

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

  • Читать дальше
  • 1
  • ...
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: