11.12. Изучение использования индексов#

11.12. Изучение использования индексов

11.12. Изучение использования индексов

Хотя индексы в Tantor SE не требуют обслуживания или настройки, все же важно проверить, какие индексы фактически используются рабочей нагрузкой реального запроса. Исследование использования индексов для отдельного запроса выполняется с помощью команды EXPLAIN; ее применение для этой цели иллюстрируется в Раздел 14.1. Также возможно собирать общую статистику об использовании индексов в работающем сервере, как описано в Раздел 27.2.

Составление общей процедуры определения необходимых индексов является сложной задачей. В предыдущих разделах были приведены несколько типичных случаев, которые были показаны на примерах. Часто требуется проводить много экспериментов. В остальной части этого раздела приведены несколько советов по этому поводу:

  • Всегда сначала запускайте ANALYZE. Эта команда собирает статистику о распределении значений в таблице. Эта информация необходима для оценки количества строк, возвращаемых запросом, что требуется планировщику для назначения реалистичных затрат для каждого возможного плана запроса. В отсутствие реальной статистики предполагаются некоторые значения по умолчанию, которые почти наверняка будут неточными. Изучение использования индексов приложением без запуска ANALYZE - это бесполезное дело. См. Раздел 24.1.3 и Раздел 24.1.6 для получения дополнительной информации.

  • Используйте реальные данные для экспериментов. Использование тестовых данных для настройки индексов позволит вам определить, какие индексы вам нужны для тестовых данных, но это все.

    Особенно критично использовать очень маленькие наборы тестовых данных. В то время как выборка 1000 из 100000 строк может быть кандидатом на использование индекса, выборка 1 из 100 строк вряд ли будет, потому что, вероятно, 100 строк помещаются на одну дисковую страницу, и нет плана, который может превзойти последовательное извлечение 1 дисковой страницы.

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

  • Когда индексы не используются, может быть полезно для тестирования принудительно применить их. Существуют параметры времени выполнения, которые могут отключить различные типы планов (см. Раздел 19.7.1). Например, отключение последовательного сканирования (enable_seqscan) и соединений вложенным циклом (enable_nestloop), которые являются самыми базовыми планами, заставит систему использовать другой план. Если система все равно выбирает последовательное сканирование или соединение вложенным циклом, то, вероятно, есть более фундаментальная причина, по которой индекс не используется; например, условие запроса не соответствует индексу. (Какой тип запроса может использовать какой тип индекса объясняется в предыдущих разделах).

  • Если принудительное использование индекса действительно использует индекс, то есть две возможности: либо система права и использование индекса действительно неуместно, либо оценки стоимости планов запросов не отражают реальность. Поэтому вы должны замерить время выполнения запроса с индексами и без них. Команда EXPLAIN ANALYZE может быть полезной в этом случае.

  • Если оказывается, что оценки стоимости неверны, существует две возможности. Общая стоимость вычисляется из стоимости каждого узла плана, умноженной на оценку селективности узла плана. Оценки стоимости для узлов плана могут быть скорректированы с помощью параметров времени выполнения (описанных в Раздел 19.7.2). Неточная оценка селективности обусловлена недостаточной статистикой. Возможно, это можно улучшить, настроив параметры сбора статистики (см. ALTER TABLE).

    Если вам не удается настроить затраты таким образом, чтобы они были более подходящими, то вам может прийтись прибегнуть к явному принудительному использованию индекса. Возможно, вам также захочется связаться с разработчиками Tantor SE, чтобы рассмотреть эту проблему.