TATECHATLAS
◎ Русский
SAP и ERP / Совет

Сравнение планов параметризованных запросов в SAP HANA Cloud с помощью SQL Analyzer

Сравните планы параметризованных запросов, создавая отдельные файлы планов для каждого значения параметра в SQL Analyzer, чтобы выбрать между использованием Plan Variants и переписыванием запроса на основе выявленных различий.

В этом материале

Используйте SAP HANA SQL Analyzer для генерации отдельного файла плана для каждого набора параметров, затем сравните время выполнения на уровне шагов, количество записей и последовательность операторов в этих файлах. Если оптимизатор выбирает другой план для медленного значения параметра (например, полное сканирование column-store вместо поиска по индексу), решите, следует ли включить Plan Variants, чтобы HANA кэшировала несколько планов на основе кластеров селективности, или переписать запрос и модель для стабилизации плана. SQL Analyzer доступен только при установленном расширении SAP HANA Performance Tools в пространстве разработки, а пользователю требуются привилегии TRACE ADMIN и INIFILE ADMIN. Plan Variants помогают, когда оптимизатор может сгруппировать значения параметров в отдельные кластеры селективности, но они не исправляют запросы, структура которых изначально неэффективна для всех входных данных.

Контекст: параметризованные запросы и колебания производительности

Параметризованный запрос может работать быстро для одних входных значений и медленно для других из-за перекоса распределения данных. Оптимизатор компилирует один план на один оператор, и этот план может быть оптимальным для узкого диапазона селективности, но плохим для широкого. Например, табличная функция, принимающая параметр региона, может возвращать 50 строк за 20 мс для региона DE, но 2 миллиона строк за 4 с для региона GLOBAL. Эта разница не обязательно является ошибкой в запросе; часто это выбор плана, зависящий от селективности. Первым шагом является захват плана выполнения для каждого набора параметров и их сравнение с помощью SQL Analyzer. Цель состоит в том, чтобы определить, вызваны ли колебания выбором плана и будет ли правильным решением включение Plan Variants или переписывание запроса.

SQL Analyzer представляет собой набор представлений, таблиц и графиков, позволяющих анализировать любой SQL-запрос. Вы можете детально изучить выполнение графа, проанализировать временную шкалу компиляции и выполнения запроса, визуализировать используемые таблицы, увидеть количество записей, обработанных на каждом шаге, и проверить последовательность операторов. Он не ограничен расчетными представлениями (calculation views); он может анализировать SQL, определенный в табличных функциях и операторах SQL Console. Для его использования необходимо добавить расширение SAP HANA Performance Tools в пространство разработки, что возможно только при остановленном пространстве разработки. Анализирующему пользователю требуются системные привилегии TRACE ADMIN и INIFILE ADMIN. Рабочий процесс начинается с размещения параметризованного SQL в SQL Console, затем генерации файла плана с помощью Analyze Generate SQL Analyzer Plan File и, наконец, открытия файла плана в представлении HANA SQL Analyzer.

Файлы планов могут быть созданы во встроенном SAP HANA Database Explorer, где файл плана открывается непосредственно в представлении SQL Analyzer, или во внешних инструментах, где файл плана должен быть загружен и импортирован в представление Explorer в SAP Business Application Studio. Расположение генерируемых файлов планов фиксировано и не может быть изменено. Если вы хотите проанализировать файл плана позже, вы можете получить к нему доступ через представление Explorer или во внешнем проводнике базы данных в разделе Catalog Database Diagnostic Files DB Instance ID other. Ключевым моментом является то, что вам нужен отдельный файл плана для каждого значения параметра, которое вы хотите сравнить. Одного кэшированного плана недостаточно, когда селективность варьируется в зависимости от значений параметров.

Сравнение должно быть сосредоточено на времени выполнения на уровне шагов, количестве обработанных записей и последовательности операторов. Шаг, который занимает значительно больше времени, чем остальные, или шаг, обрабатывающий гораздо больше записей, чем ожидалось, является узким местом. Последовательность операторов показывает, выбрал ли оптимизатор другой порядок соединений, другой путь доступа или другой движок обработки. Если план отличается для медленного значения параметра, вы можете либо включить Plan Variants, чтобы HANA кэшировала несколько планов на основе кластеров селективности фильтров, либо переписать запрос и реструктурировать модель, чтобы оптимизатор создавал стабильный план для всех диапазонов селективности. Решение зависит от того, может ли оптимизатор различать кластеры селективности и является ли структура запроса фундаментально эффективной.

Plan Variants позволяют SAP HANA кэшировать несколько планов выполнения для параметризованного запроса на основе селективности фильтров таблиц. Оптимизатор оценивает предикаты, компилирует планы и связывает значения фильтров с кластерами. Это снижает колебания производительности и обеспечивает более стабильную работу запросов. Однако Plan Variants помогают только тогда, когда оптимизатор может сгруппировать значения параметров в отдельные кластеры селективности. Если структура запроса изначально неэффективна для всех входных данных или если оптимизатор не может различить кластеры, одно лишь управление планами не решит проблему. В этом случае единственным вариантом остается переписывание запроса или реструктуризация модели.

Представления мониторинга M_SQL_PLAN_VARIANTS и M_SQL_PLAN_VARIANT_STATISTICS могут быть использованы для мониторинга активных Plan Variants и просмотра соответствующей статистики выполнения. Эти представления помогают убедиться, что оптимизатор создал ожидаемые кластеры и что планы используются. Они также помогают измерить улучшение производительности, достигнутое с помощью Plan Variants, включая снижение колебаний и обеспечение стабильности. Решение о переписывании должно основываться на данных из файлов планов, а не на предположениях о распределении данных.

Конкретный пример: табличная функция, принимающая параметр региона. Для региона DE запрос возвращает 50 строк за 20 мс; для региона GLOBAL он возвращает 2 миллиона строк за 4 с. Разместите оба параметризованных вызова в SQL Console, сгенерируйте два файла планов, откройте их рядом в SQL Analyzer и заметьте, что для GLOBAL оптимизатор выбрал полное сканирование column-store с соединением nested-loop вместо поиска по индексу и hash-join, который использовался для DE. Это подтверждает, что план различается в зависимости от значения параметра, и предполагает либо включение Plan Variants для кэширования обоих планов, либо переписывание порядка соединений и проталкивания фильтров (filter pushdown), чтобы оптимизатор создавал стабильный план для всех диапазонов селективности.

SELECT * FROM TABLE(TABLE_FUNCTION(:region)) WHERE region = :region;

Обоснование: Plan Variants против переписывания запроса

Параметризованный запрос кэшируется с одним планом выполнения, но этот план является компромиссом. Когда селективность фильтра меняется, оптимальный план также может измениться. Если оптимизатор не может различить кластеры селективности, он может выбрать план, который хорош для одних значений и плох для других. Это коренная причина колебаний производительности SQL. Plan Variants решают эту проблему, позволяя SAP HANA кэшировать несколько планов для параметризованных запросов на основе селективности фильтров таблиц. Оптимизатор оценивает предикаты, компилирует планы и связывает значения фильтров с кластерами. Это означает, что система может хранить один план для узкого, селективного диапазона и другой план для широкого, неселективного диапазона.

Ограничение кэширования только одного плана выполнения заключается в том, что он не может адаптироваться к изменениям в распределении данных. План, оптимальный для маленького набора результатов, может быть ужасен для большого, так как он использует nested-loop join или полное сканирование. Plan Variants решают это, создавая отдельные планы для каждого кластера селективности. Оптимизатор определяет, к какому кластеру относится значение параметра, и использует соответствующий план. Это снижает колебания производительности и обеспечивает более стабильную работу. Представления мониторинга M_SQL_PLAN_VARIANTS и M_SQL_PLAN_VARIANT_STATISTICS показывают активные Plan Variants и их статистику выполнения, что позволяет проверить правильность создания кластеров и использование планов.

Однако Plan Variants не являются универсальным решением. Они помогают только тогда, когда оптимизатор может различить кластеры селективности. Если структура запроса изначально неэффективна для всех входных данных или если оптимизатор не может разделить значения параметров на отдельные кластеры, управление планами не улучшит производительность. В таком случае остается вариант переписать запрос или реструктурировать модель. Переписывание может изменить порядок соединений, проталкивать фильтры вниз или заменить табличную функцию более эффективной конструкцией. Решение должно основываться на файлах планов из SQL Analyzer, а не на предположениях о распределении данных.

Рабочий процесс заключается в генерации файлов планов для каждого значения параметра, их сравнении в SQL Analyzer и последующем решении о необходимости Plan Variants или переписывания. Если файлы планов показывают разные последовательности операторов, количество записей или время выполнения шагов, значит, оптимизатор уже различает значения параметров. В этом случае включение Plan Variants может снизить колебания. Если файлы планов показывают один и тот же план, но этот план медленный для конкретного значения параметра, значит, оптимизатор не различает кластеры, и, скорее всего, требуется переписывание. Представления мониторинга помогают подтвердить, что Plan Variants активны и статистика выполнения соответствует ожидаемым кластерам селективности.

Ключевое различие заключается в управлении планами и структуре запроса. Plan Variants управляют несколькими планами для параметризованного запроса, но они не исправляют запрос, структура которого неэффективна для всех входных данных. Если оптимизатор не может различить кластеры селективности или если перекос данных экстремален, запрос должен быть переписан. Доказательства из SQL Analyzer должны направлять это решение. Файлы планов показывают, выбирает ли оптимизатор разные планы для разных значений параметров и являются ли эти планы стабильными. Если планы стабильны, но медленны для конкретного значения параметра, проблема в структуре запроса. Если планы различаются, но для широкого диапазона селективности выбирается медленный план, Plan Variants могут быть достаточны.

Представления мониторинга предоставляют доказательства, необходимые для принятия этого решения. M_SQL_PLAN_VARIANTS показывает активные Plan Variants, а M_SQL_PLAN_VARIANT_STATISTICS - соответствующую статистику выполнения. Вы можете использовать эти представления, чтобы убедиться, что оптимизатор создал ожидаемые кластеры и что планы используются. Это важно, так как Plan Variants могут создавать дополнительные накладные расходы, и необходимо подтвердить, что выгода перевешивает затраты. Решение о переписывании должно основываться на файлах планов и представлениях мониторинга, а не на предположениях о распределении данных.

Конкретный пример: табличная функция с параметром региона. Для DE запрос возвращает 50 строк за 20 мс; для GLOBAL - 2 миллиона строк за 4 с. Разместите оба вызова в SQL Console, сгенерируйте два файла планов, откройте их рядом в SQL Analyzer и заметьте, что для GLOBAL оптимизатор выбрал полное сканирование column-store с nested-loop join вместо index-seek и hash-join, использованных для DE. Это подтверждает различие планов и указывает на необходимость либо Plan Variants, либо переписывания порядка соединений и проталкивания фильтров для стабилизации плана.

SELECT * FROM M_SQL_PLAN_VARIANTS WHERE SCHEMA_NAME = '<container_schema_name>' AND OBJECT_NAME = '<calculation_view_or_function>';

Конкретная иллюстрация: сравнение файлов планов в SQL Analyzer

Рабочий процесс начинается с размещения параметризованного SQL в SQL Console. Выполнять запрос не обязательно; нужно только сгенерировать файл плана. Используйте опцию меню Analyze Generate SQL Analyzer Plan File, выберите префикс имени файла и сохраните. Расположение уже задано и не может быть изменено. Если SQL Console была открыта из встроенного SAP HANA Database Explorer, файл плана немедленно открывается в представлении HANA SQL Analyzer. Если файл плана был создан в другом инструменте, таком как Data Preview или внешнем SAP HANA Database Explorer, вы должны скачать файл плана и загрузить его в представление Explorer в SAP Business Application Studio. Расширение SAP HANA Performance Tools должно быть добавлено в пространство разработки, что возможно только при остановленном пространстве разработки.

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

Для конкретного примера сгенерируйте два файла планов: один для региона DE и один для региона GLOBAL. Откройте оба файла в SQL Analyzer и сравните их рядом. Для региона DE план должен показать поиск по индексу (index seek) и hash join с небольшим количеством обработанных записей. Для региона GLOBAL план должен показать полное сканирование column-store и nested-loop join с огромным количеством записей. Время выполнения на уровне шагов и количество записей подтвердят разницу. Это доказывает, что оптимизатор выбрал другой план для медленного значения параметра, и указывает на необходимость Plan Variants или переписывания запроса.

Сравнение должно быть сосредоточено на последовательности операторов, так как она раскрывает, выбрал ли оптимизатор другой порядок соединений, путь доступа или движок обработки. Полное сканирование column-store вместо поиска по индексу - распространенный признак несоответствия селективности. Nested-loop join вместо hash join - еще один признак. Количество записей, обрабатываемых на каждом шаге, говорит о том, с каким объемом данных работает план. Если шаг обрабатывает миллионы строк, когда должен обрабатывать десятки, этот шаг является узким местом. Временная шкала компиляции и выполнения помогает понять, где именно происходит замедление: при компиляции, выполнении или на конкретном операторе.

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

Конкретный пример: табличная функция с параметром региона. Для DE запрос возвращает 50 строк за 20 мс; для GLOBAL - 2 миллиона строк за 4 с. Разместите оба вызова в SQL Console, сгенерируйте два файла планов, откройте их рядом в SQL Analyzer и заметьте, что для GLOBAL оптимизатор выбрал полное сканирование column-store с nested-loop join вместо index-seek и hash-join, использованных для DE. Это подтверждает различие планов и указывает на необходимость либо Plan Variants, либо переписывания порядка соединений и проталкивания фильтров для стабилизации плана.

EXPLAIN PLAN FOR SELECT * FROM TABLE(TABLE_FUNCTION(:region)) WHERE region = :region;

Ограничения применимости

SQL Analyzer требует расширения SAP HANA Performance Tools в пространстве разработки, и это расширение может быть добавлено только при остановленном пространстве разработки. Это предварительное условие, которое необходимо проверить перед началом работы. Анализирующему пользователю требуются системные привилегии TRACE ADMIN и INIFILE ADMIN. Эти привилегии являются системными и могут не предоставляться пользователям приложений в продуктивной среде, поэтому рабочий процесс может быть доступен не всем пользователям. Файлы планов, созданные вне встроенного SAP HANA Database Explorer, должны загружаться и импортироваться вручную, что добавляет шаг в рабочий процесс. Расположение генерируемых файлов планов фиксировано и не может быть изменено, что может усложнить процесс.

Plan Variants помогают только тогда, когда оптимизатор может сгруппировать значения параметров в отдельные кластеры селективности. Они не исправляют запрос, структура которого изначально неэффективна для всех входных данных. Если оптимизатор не может различить кластеры селективности или если перекос данных экстремален, одно лишь управление планами не решит проблему. В таком случае остается вариант переписать запрос или реструктурировать модель. Представления мониторинга M_SQL_PLAN_VARIANTS и M_SQL_PLAN_VARIANT_STATISTICS помогают убедиться, что оптимизатор создал ожидаемые кластеры и что планы используются, но они не меняют базовую структуру запроса.

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

Конкретный пример: табличная функция с параметром региона. Для DE запрос возвращает 50 строк за 20 мс; для GLOBAL - 2 миллиона строк за 4 с. Разместите оба вызова в SQL Console, сгенерируйте два файла планов, откройте их рядом в SQL Analyzer и заметьте, что для GLOBAL оптимизатор выбрал полное сканирование column-store с nested-loop join вместо index-seek и hash-join, использованных для DE. Это подтверждает различие планов и указывает на необходимость либо Plan Variants, либо переписывания порядка соединений и проталкивания фильтров для стабилизации плана.

SELECT * FROM M_SQL_PLAN_VARIANTS WHERE SCHEMA_NAME = '<container_schema_name>' AND OBJECT_NAME = '<calculation_view_or_function>';

Условия применения

  • Установлено ли расширение SAP HANA Performance Tools в остановленном пространстве разработки?
  • Обладает ли анализирующий пользователь системными привилегиями TRACE ADMIN и INIFILE ADMIN?
  • Сгенерированы ли отдельные файлы планов для каждого значения параметра, а не один кэшированный план?
  • Показывают ли файлы планов разные последовательности операторов, количество записей или время выполнения шагов для медленного набора параметров?
  • Может ли оптимизатор различать кластеры селективности или структура запроса изначально неэффективна?
  • Находится ли запрос внутри табличной функции, расчетного представления или SQL Console, которые может исследовать SQL Analyzer?
  • Загружены ли файлы планов из внешних инструментов или открыты напрямую из встроенного проводника базы данных?
  • Снижает ли включение Plan Variants колебания производительности без изменения логики самого запроса?
  • Потребуется ли переписывание порядка соединений, проталкивание фильтров или изменение модели данных, если оптимизатор не может создать стабильный план?
  • Является ли средой SAP HANA Cloud с HDI-контейнером и пространством разработки, поддерживающим расширение?

SQL Analyzer требует расширения SAP HANA Performance Tools, которое можно добавить только при остановленном пространстве разработки. Plan Variants помогают только в случае, если оптимизатор может сгруппировать значения параметров в отдельные кластеры селективности; они не исправляют запросы с изначально неэффективной структурой. Привилегии TRACE ADMIN и INIFILE ADMIN являются системными и могут быть недоступны пользователям приложений в продуктивной среде. Файлы планов, созданные вне встроенного SAP HANA Database Explorer, требуют ручного скачивания и загрузки. Plan Variants не отменяют необходимость анализа запроса, если оптимизатор не может различить селективность или если наблюдается экстремальный перекос данных.

Источники

  1. SAP Learning: Analyzing executions with the SQL Analyzer ↗
  2. SAP Learning: Using plan variants to optimize parameterized queries ↗
Наверх ↑