Часто задаваемые вопросы по OpenEdge RDBMS
VI. Вопросы по индексам
35. Лучше ли использовать ключи из одного поля или составные ключи?
Используйте составные ключи, когда они нужны. Весь смысл иметь индексы заключается в том, чтобы выполнить задачу поиска записей, которые вам нужны и только тех записей, которые вам нужны, как можно быстрее. В большинстве приложений это требуется делать более чем одним способом. Иногда вам нужна одна запись, например, с заданным номером телефона. В другом случае вам нужна группа записей, которая удовлетворяет некоторому набору критериев, например, все закупки, сделанные у конкретного поставщика в прошлом месяце.
Индексы, которые вы определяете, должны хорошо совпадать с видами запросов, которые вы делаете в вашем приложении. Это не всегда возможно сделать для каждого запроса, но если возможно, то производительность может быть значительно улучшена. Всегда имеются досадные компромиссы, такие, как: Стоят ли дополнительные накладные расходы на индекс экономии времени? Стоит ли усилий ускорение одного отчета, который выполняется один раз в год?
Простой пример: Предположим, что у вас есть таблица orders со следующими полями:
- order number
- order date
- customer number
- other important stuff
Если у вас есть 3 индекса, один для order number, один для order date, и один для customer number, то, когда вы хотите выполнить запрос для всех заказов одного клиента для диапазона дат, скажем, за последний год, если заказы выбираются по индексу customer number, они не будут правильно упорядочены по дате. Таким образом, в конечном итоге, вы будете выбирать все заказы для клиента, а не только за последний год, и 4GL будет отбрасывать те, которые вам не нужны.
Если вместо этого вы выбираете заказы по диапазону дат используя индекс order date, то вы получаете записи для всех клиентов за последний год, и 4GL должен отбрасывать записи, которые вам не нужны.
В зависимости от типа запроса, 4GL может использовать одновременно более одного индекса, что иногда полезно, но не всегда, и часто не лучше, чем использование правильного составного индекса. В данном случае, это будет означать получение двух отдельных наборов записей (или иногда просто rowid-ов), используя индекс date и customer number, оба набора будут больше, чем необходимо, сортировку, вычисление пересечения и отбрасывание ненужных записей.
Когда имеется составной индекс по customer number и по order date, запрос может использовать этот индекс для простого брекетирования только строк, нужных для этого конкретного клиента.
Не забывайте о запросах SQL при определении индексов. Одной из причин низкой производительности запросов SQL является отсутствие соответствующих индексов. В общем, SQL требует большего числа индексов, чем приложения 4GL. Одна из причин этого заключается в том, что SQL часто используется для ad-hoc запросов.
36. Почему небольшие индексы имеют низкую степень использования пространства даже после сжатия?
Под небольшими индексами мы здесь понимаем индексы, занимающие около 100 или меньше блоков данных.
Рассмотрим индекс с одной записью. Этот индекс будет полностью занимать один индексный блок, который будет одновременно и корневым блоком и блоком листа. Большая часть пространства не будет использована, потому что больше нет данных.
Теперь добавим еще несколько записей индекса. В конце концов, один блок станет полон или почти полон. Затем добавим еще одну запись, и блок придется разделить на два. Эти два блока листьев, вероятно, будут содержать примерно половину записей каждый. Но нам также нужен промежуточный блок (корневой блок), который будет содержать указатели на два блока листьев. Так что теперь индекс занимает три блока и не может быть сделан меньше. Конечные блоки заполнены наполовину, а корневой блок почти пуст.
Какой процент использования пространства вы получите, зависит от данных. Это зависит частично от длины ключа и частично от степени сжатия, которая может быть достигнута.
Значение в 100 блоков является только предположительным. Постепенно, по мере накопления достаточного количества данных, эти вещи становятся менее заметным.
Для небольших индексов степень использования пространства не имеет большого значения в любом случае.
37. Как плотно следует упаковывать индексы?
Обе программы, перестроения индексов и уплотнения индексов, имеют параметры, которые управляют процентом заполнения для конечных блоков индекса. Оба этих инструмента используют значение по умолчанию 80 процентов. Это значение подходит в большинстве случаев индексов, которые обновляются. Для таблиц, которые доступны только для чтения, используйте 100 процентов.
Если вы попытаетесь указать 100 процентов для индексов, для которых выполняются вставки и удаления, вы увидите большое количество разбиений блока по мере добавления новых записей в индекс. Это будет продолжаться, пока есть пространство для новых записей в индексе.