Поделиться через


Настройка индекса

ОБЛАСТЬ ПРИМЕНЕНИЯ: База данных Azure для PostgreSQL — гибкий сервер

Настройка индекса — это функция гибкого сервера Базы данных Azure для PostgreSQL, которая автоматически повышает производительность рабочей нагрузки, анализируя отслеживаемые запросы и предоставляя рекомендации по индексу.

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

Общее описание алгоритма настройки индекса

index_tuning.mode При настройке reportпараметра сервера сеансы настройки автоматически запускаются с частотой, настроенной в параметре index_tuning.analysis_intervalсервера, выраженной в минутах.

На первом этапе сеанс настройки ищет список баз данных, в которых он считает, что любые рекомендации, которые могут привести к значительному влиянию на общую производительность системы. Для этого он собирает все запросы, записанные хранилищем запросов, выполнение которых было записано в интервале подстановки, на этом сеансе настройки основное внимание уделяется. Интервал подстановки в настоящее время охватывает последние index_tuning.analysis_interval минуты с момента начала сеанса настройки.

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

В этом списке исключены следующие запросы:

  • Запросы, инициированные системой. (то есть запросы, выполняемые ролью azuresu )
  • Запросы, выполняемые в контексте любой системной базы данных (azure_sys, , template0template1иazure_maintenance).

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

Рекомендации CREATE INDEX

Для каждой базы данных, определяемой как кандидат для анализа рекомендаций по индексу, все запросы SELECT, UPDATE, INSERT и DELETE, выполняемые в интервале подстановки, и в контексте этой конкретной базы данных учитываются.

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

Потенциальные рекомендации предназначены для повышения производительности этих типов запросов:

  • Запросы с фильтрами (то есть запросы с предикатами в предложении WHERE);
  • Запросы, присоединенные к нескольким отношениям, соответствуют ли они синтаксису, в котором соединения выражаются с предложением JOIN, или выражаются ли предикаты соединения в предложении WHERE.
  • Запросы, объединяющие фильтры и предикаты соединения.
  • Запросы с группировкой (запросы с предложением GROUP BY).
  • Запросы, объединяющие фильтры и группировку.
  • Запросы с сортировкой (запросы с предложением ORDER BY).
  • Запросы, объединяющие фильтры и сортировку.

Примечание.

Единственным типом индексов, которые в настоящее время рекомендует система, являются те из типов B-Tree.

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

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

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

index_tuning.max_index_count указывает количество рекомендаций по индексу, созданных для всех таблиц любой базы данных, проанализированных во время сеанса настройки.

Для создания рекомендации по индексу подсистема настройки должна оценить, что он улучшает по крайней мере один запрос в анализируемой рабочей нагрузке с помощью фактора, указанного в index_tuning.min_improvement_factorпараметре.

Аналогичным образом, все рекомендации по индексу проверяются, чтобы убедиться, что они не вводят регрессию в одном запросе в этой рабочей нагрузке фактора, указанного с index_tuning.max_regression_factor.

Примечание.

index_tuning.min_improvement_factor и то, и index_tuning.max_regression_factor другое относится к стоимости планов запросов, а не к их длительности или ресурсам, которые они используют во время выполнения.

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

Скрипт, созданный вместе с рекомендацией по созданию индекса, следует следующему шаблону:

create index concurrently {indexName} on {schema}.{table}({column_name}[, ...])

Он включает предложение concurrently. Дополнительные сведения о влиянии этого предложения см. в официальной документации PostgreSQL для CREATE INDEX.

Настройка индекса автоматически создает имена рекомендуемых индексов, которые обычно состоят из имен различных ключевых столбцов, разделенных символами "_" (подчеркивания) и суффиксом константы "_idx". Если общая длина имени превышает ограничения PostgreSQL или если она сталкивается с существующими отношениями, имя немного отличается. Оно может быть усечено, а число может быть добавлено в конец имени.

Вычисление влияния рекомендации CREATE INDEX

Влияние создания рекомендации по индексу измеряется на IndexSize (мегабайты) и QueryCostImprovement (процент).

IndexSize — это одно значение, представляющее предполагаемый размер индекса, учитывая текущее кратность таблицы и размер столбцов, на которые ссылается рекомендуемый индекс.

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

Рекомендации DROP INDEX и REINDEX

Для каждой базы данных, для которой определена функция настройки индекса, она должна инициировать новый сеанс, а после завершения этапа рекомендаций CREATE INDEX рекомендуется удалить или переиндексировать существующие индексы на основе следующих критериев:

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

Удаление повторяющихся индексов

Рекомендации по удалению повторяющихся индексов: сначала определите, какие индексы имеют дубликаты.

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

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

Для двух индексов, которые следует считать повторяющимися, они должны:

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

Удаление неиспользуемых индексов

Рекомендации по удалению неиспользуемых индексов определяют эти индексы, которые:

  • Не используются по крайней мере index_tuning.unused_min_period в течение нескольких дней.
  • Отображение минимального (ежедневного среднего) количества динамических index_tuning.unused_dml_per_table адресов в таблице, в которой создается индекс.
  • Отображение минимального (ежедневного index_tuning.unused_reads_per_table среднего) количества операций чтения в таблице, в которой создается индекс.

Повторное индексирование недопустимых индексов

Рекомендации по повторной индексации существующих индексов определяют те индексы, которые помечены как недопустимые. Дополнительные сведения о том, почему и когда индексы помечены как недопустимые, см . в официальной документации по REINDEX в PostgreSQL.

Вычисление влияния рекомендации DROP INDEX

Влияние рекомендации по снижению индекса измеряется на двух измерениях: преимущество (процент) и IndexSize (мегабайты).

Преимущество — это одно значение, которое можно игнорировать сейчас.

IndexSize — это одно значение, представляющее предполагаемый размер индекса, учитывая текущее кратность таблицы и размер столбцов, на которые ссылается рекомендуемый индекс.

Настройка настройки индекса

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

Если настройка индекса включена, она просыпается с частотой, настроенной в index_tuning.analysis_interval параметре сервера (по умолчанию — 720 минут или 12 часов) и начинает анализировать рабочую нагрузку, записанную в хранилище запросов в течение этого периода.

Обратите внимание, что если значение изменено index_tuning.analysis_interval, оно наблюдается только после завершения следующего запланированного выполнения. Например, если включить настройку индекса в один день в 10:00 УТРА, так как значение index_tuning.analysis_interval по умолчанию составляет 720 минут, первое выполнение должно начинаться в 10:00 в тот же день. Любые изменения, index_tuning.analysis_interval внесенные в значение от 10:00 ДО 10:00PM, не влияют на начальное расписание. Только после завершения запланированного выполнения он будет считывать текущее значение и index_tuning.analysis_interval запланировать следующее выполнение в соответствии с этим значением.

Для настройки параметров настройки индекса доступны следующие параметры:

Параметр Описание По умолчанию Диапазон Единицы измерения
index_tuning.analysis_interval Задает частоту, с которой запускается каждый сеанс оптимизации индекса, если задано REPORTзначение index_tuning.mode. 720 60 - 10080 протокол
index_tuning.max_columns_per_index Максимальное количество столбцов, которые могут быть частью ключа индекса для любого рекомендуемого индекса. 2 1 - 10
index_tuning.max_index_count Максимальные индексы, рекомендуемые для каждой базы данных во время одного сеанса оптимизации. 10 1 - 25
index_tuning.max_indexes_per_table Максимальное количество индексов, которые можно использовать для каждой таблицы. 10 1 - 25
index_tuning.max_queries_per_database Количество медленных запросов для каждой базы данных, для которой можно использовать индексы. 25 5 - 100
index_tuning.max_regression_factor Допустимая регрессия, представленная рекомендуемым индексом для любого из запросов, проанализированных во время одного сеанса оптимизации. 0.1 0.05 - 0.2 процент
index_tuning.max_total_size_factor Максимальный общий размер ( в процентах от общего места на диске), что все рекомендуемые индексы для любой конкретной базы данных могут использовать. 0.1 0 - 1 процент
index_tuning.min_improvement_factor Улучшение затрат, которое рекомендуется обеспечить по крайней мере одному из запросов, проанализированных во время одного сеанса оптимизации. 0.2 0 - 20 процент
index_tuning.mode Настраивает оптимизацию индекса как отключенную (OFF) или включенную только рекомендацию. Требует, чтобы хранилище запросов было включено с помощью параметра pg_qs.query_capture_modeTOP или ALL. OFF OFF, REPORT
index_tuning.unused_dml_per_table Минимальное количество ежедневных операций DML, влияющих на таблицу, поэтому их неиспользуемые индексы считаются для удаления. 1000 0 - 9999999
index_tuning.unused_min_period Минимальное количество дней, которое индекс не использовался на основе системной статистики, поэтому он считается снижением. 35 30 - 70
index_tuning.unused_reads_per_table Минимальное количество ежедневных операций чтения, влияющих на таблицу, чтобы их неиспользуемые индексы считались для удаления. 1000 0 - 9999999

При использовании команд az postgres flexible-server index-tuning show-settings CLI и az postgres flexible-server index-tuning set-settings отображения или изменения любого из параметров настройки индекса значения, принятые в качестве аргументов для --name параметра, отображаются в столбце параметров предыдущей таблицы, но без включения префикса index_tuning..

Сведения, созданные с помощью настройки индекса

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

Ограничения и возможность поддержки

Ниже приведен список ограничений и области поддержки для настройки индекса.

Автоматическое удаление рекомендаций

Рекомендации автоматически удаляются через 35 дней после последнего их производства. Для работы этого механизма автоматического удаления необходимо включить оптимизацию индекса.

Зависимость от расширения гипопга

Для настройки индекса для создания рекомендаций CREATE INDEX используется расширение гипопg .

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

Если расширение не существовало в первую очередь или мы удалили его из-за того, что он был создан в pg_catalog схеме, настройка индекса создаст его под именем ms_temp_recommendations709253 схемы и, когда сеанс настройки завершится успешно, он удаляет расширение и удаляет схему.

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

Поддерживаемые уровни вычислений и номера SKU

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

Поддерживаемые версии PostgreSQL

Настройка индекса поддерживается в основных версиях 12 или более позднихверсий База данных Azure для PostgreSQL гибкого сервера.

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

Настройка индекса использует значение, сохраненное в столбце search_pathquery_store.qs_view, чтобы при анализе каждого запроса было задано то же значение search_path , которое было задано при первоначальном выполнении запроса, является тем, к которому он настроен для анализа возможных рекомендаций.

Параметризованные запросы

Параметризованные запросы, созданные с помощью PREPARE или с помощью расширенного протокола запросов, анализируются и анализируются для создания рекомендаций по индексу для них.

Для анализа параметризованных запросов настройка индекса требует, чтобы для параметра pg_qs.parameters_capture_mode задано значение capture_first_sample , когда хранилище запросов фиксирует выполнение запроса. Кроме того, требуется, чтобы параметры правильно захватывались хранилищем запросов при выполнении запроса. Другими словами, для анализируемого запроса query_store.qs_view должен иметь значение столбца parameters_capture_statussucceeded.

Режим только для чтения и реплики чтения

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

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

Уменьшение масштаба вычислений

Если настройка индекса включена на сервере, и вы масштабируете вычислительные ресурсы этого сервера до меньше минимального количества необходимых виртуальных ядер, функция остается включенной. Так как эта функция не поддерживается на серверах с менее чем 4 виртуальными ядрами, она не выполняется для анализа рабочей нагрузки и создания рекомендаций, даже если index_tuning.mode задано значение ON при уменьшении масштаба вычислений. Хотя сервер не соответствует минимальным требованиям, все index_tuning.* параметры сервера недоступны. Каждый раз, когда вы масштабируете резервную копию сервера до вычисления, соответствующего минимальным требованиям, настраивается с любым значением, index_tuning.mode заданным перед масштабированием до вычисления, который не соответствует требованиям.

Высокая доступность и реплики чтения

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