Хотя индексы в Digital Q.DataBase не требуют обслуживания или настройки, все же важно проверять, какие индексы фактически используются при реальной нагрузке запросов. Изучение использования индексов для отдельного запроса выполняется с помощью команды EXPLAIN команды; ее применение для этой цели описано в Раздел 2.11.1. Также можно собрать общую статистику об использовании индексов на работающем сервере, как описано в Раздел 3.12.2.
Сформулировать универсальный алгоритм для определения набора необходимых индексов довольно сложно. Ряд типичных случаев был рассмотрен в примерах в предыдущих разделах. Часто требуется проведение множества экспериментов. В оставшейся части данного раздела приведены некоторые рекомендации по этому вопросу:
Всегда выполняйте ANALYZE
в первую очередь. Эта команда
собирает статистику о распределении значений в
таблице. Данная информация необходима для оценки количества строк, возвращаемых оператором SELECT, что требуется планировщику запросов для назначения реалистичной стоимости каждому возможному плану выполнения. В отсутствие реальной статистики принимаются значения по умолчанию, которые почти наверняка окажутся неточными. Анализ использования индексов приложением без предварительного выполнения команды ANALYZE поэтому
бессмыслен.
См. Раздел 3.9.1.3
и Раздел 3.9.1.6 для получения дополнительной информации.
Используйте реальные данные для проведения тестов. Использование тестовых данных для настройки индексов позволит определить, какие индексы необходимы именно для этого набора данных, но не более того.
Использование очень малых наборов тестовых данных может привести к ошибочным выводам. В то время как выборка 1000 из 100 000 строк является подходящим случаем для использования индекса, выборка 1 из 100 строк — вряд ли, поскольку 100 строк, скорее всего, помещаются на одной дисковой странице, и ни один план не будет эффективнее последовательного сканирования одной дисковой страницы.
Также следует проявлять осторожность при формировании тестовых данных, что зачастую неизбежно, если приложение еще не находится в промышленной эксплуатации. Слишком однородные, полностью случайные или вставляемые в отсортированном порядке значения искажают статистику, из-за чего она перестает соответствовать распределению реальных данных.
В случаях, когда индексы не используются, для целей тестирования может быть полезно принудительно активировать их применение. Существуют параметры времени выполнения, позволяющие отключать различные типы планов (см. Раздел 3.4.7.1).
Например, отключение последовательного сканирования
(enable_seqscan) и соединений вложенным циклом
(enable_nestloop), которые являются наиболее базовыми планами,
заставит систему использовать другой план запроса. Если система
по-прежнему выбирает последовательное сканирование или соединение вложенным циклом, то,
вероятно, существует более фундаментальная причина, по которой индекс не
используется; например, условие запроса не соответствует индексу.
(Информация о том, какие типы запросов поддерживают те или иные типы индексов, приведена в
предыдущих разделах).
Если принудительное использование индекса действительно приводит к его применению, возможны два варианта: либо система права и использование индекса действительно нецелесообразно, либо стоимостные оценки планов запросов не соответствуют действительности. Следовательно, следует измерить время выполнения запроса с индексами и без них. EXPLAIN ANALYZE
может быть полезна в данном случае.
Если окажется, что стоимостные оценки неверны, также возможны два варианта. Общая стоимость вычисляется как произведение стоимости обработки одной строки для каждого узла плана на оценку селективности этого узла. Стоимость, рассчитанную для узлов плана, можно скорректировать с помощью параметров времени выполнения (описанных в Раздел 3.4.7.2). Неточная оценка селективности обусловлена недостатком статистических данных. Эту ситуацию можно исправить путем настройки параметров сбора статистики (см. ALTER TABLE).
Если скорректировать стоимости до адекватных значений не удастся, возможно, придется прибегнуть к явному принудительному использованию индексов. Также рекомендуется обратиться к Digital Q.DataBase разработчикам для анализа данной проблемы.