Оптимизатор ORCA

ORCA — это новый модульный оптимизатор запросов в YMatrix, призванный заменить традиционный планировщик PostgreSQL. Он обеспечивает значительный прирост производительности для определённых OLAP-нагрузок. По умолчанию оптимизатор ORCA отключён в YMatrix. Чтобы использовать его, необходимо явно включить параметр конфигурации optimizer. При активации YMatrix пытается использовать ORCA для генерации планов выполнения запросов. Если ORCA не может обработать запрос, система автоматически переключается на планировщик на основе PostgreSQL.

Архитектура оптимизатора ORCA

На приведённой ниже схеме показана системная граница ORCA. Сам оптимизатор расположен внизу, а над ним находится СУБД.

ORCA получает от СУБД два типа входных данных: сам запрос (Query) и метаданные (MetaData, или MD), и возвращает физический план выполнения (Plan). Все три компонента — Query, MD и Plan — представлены в формате DLX.

Архитектура ORCA

Внутренняя структура ORCA представлена на следующей диаграмме и включает такие компоненты, как Job Execution, Job Scheduler, Memo и OS.

Внутренняя структура ORCA

  • Memo:

    • Хранит все возможные альтернативные планы.
    • Каждая группа Memo содержит логически эквивалентные выражения.
    • Физические планы выводятся непосредственно из Memo, а их стоимость вычисляется в процессе оптимизации.
  • Search (Поиск): представляет три типа задач:

    • Exploration (Исследование): логически расширяет Memo для поиска альтернативных логических планов.
    • Implementation (Реализация): преобразует логические планы в физические.
    • Optimization (Оптимизация): добавляет Enforcer-выражения на основе требуемых свойств результата и вычисляет стоимость планов.
  • Job Scheduler (Планировщик задач): координирует и выполняет задачи оптимизации.

  • Transformations (Преобразования): правила, изменяющие выражения в Memo. Делятся на две основные категории:

    • Логический план → Логический план (используются задачами Exploration).
    • Логический план → Физический план (используются задачами Implementation).
  • Property Enforcement (Принудительное соблюдение свойств): усиливает свойства данных.

    • Описывает требуемые выходные свойства для каждого оператора.
    • Если выходные данные оператора не удовлетворяют требуемым свойствам, вставляется Enforcer для их обеспечения.
  • Metadata Cache (Кэш метаданных): кэширует метаданные, используемые в ходе оптимизации.

  • OS: низкоуровневая библиотека, отвечающая за ввод-вывод, обработку исключений, управление памятью, параллелизм и другие системные сервисы.

Включение и отключение ORCA

Когда optimizer = on, YMatrix использует ORCA вместо устаревшего планировщика. Поведением ORCA можно управлять через параметр конфигурации optimizer на уровне системы, базы данных, сессии или отдельного запроса. Чтобы изменить значение по умолчанию, выполните одно из следующих действий.

Включение ORCA для всей системы

Установите параметр optimizer для всего кластера YMatrix:

  1. Войдите на хост Master-ноды под пользователем mxadmin (администратором YMatrix).
  2. Используйте утилиту gpconfig, чтобы установить параметр в on:
    gpconfig -c optimizer -v on
  3. Перезагрузите конфигурацию на Master и Segment-нодах без перезапуска кластера:
    mxstop -u

Включение ORCA для конкретной базы данных

Используйте команду ALTER DATABASE, чтобы включить ORCA только для одной базы данных. Например, для базы test_db:

ALTER DATABASE test_db SET OPTIMIZER = ON;

Включение ORCA для сессии или отдельного запроса

Используйте команду SET, чтобы включить ORCA для текущей сессии. Например, после подключения через psql:

SET optimizer = on;

Чтобы включить ORCA только для одного запроса, поместите команду SET непосредственно перед ним.

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

Как определить, используется ли ORCA

Когда ORCA включён (по умолчанию он выключен), вы можете проверить, использовался ли он для конкретного запроса, проанализировав вывод команды EXPLAIN.

  • Если план сгенерирован ORCA, в конце вывода будет строка, указывающая на оптимизатор и его версию. Например:

    Optimizer: ORCA
  • Если параметр optimizer установлен в off, либо если ORCA был включён, но запрос был передан устаревшему планировщику, вывод будет содержать:

    Optimizer: Postgres-based planner

Примечание!
При переходе на устаревший планировщик план запроса зависит от параметров конфигурации этого планировщика. Подробнее см. в разделе Параметры управления операторами.

Неподдерживаемые SQL-функции при использовании ORCA

Следующие функции SQL не поддерживаются, когда включён ORCA:

  • Индексы по выражениям (индексы, определённые на выражениях, зависящих от одного или нескольких столбцов таблицы).
  • Метод доступа GIN. ORCA поддерживает только индексы B-tree, bitmap и GiST. Индексы, созданные с использованием неподдерживаемых методов, игнорируются.
  • Внешние параметры.
  • Следующие типы секционированных таблиц:
    • Неоднородные секционированные таблицы.
    • Секционированные таблицы, у которых один из листовых разделов заменён внешней таблицей.
  • Sort-Merge Join (SMJ).
  • Упорядоченные агрегаты.
  • Аналитические расширения:
    • CUBE
    • Множественные grouping sets
  • Скалярные операторы:
    • ROW
    • ROWCOMPARE
    • FIELDSELECT
  • Агрегатные функции, принимающие в качестве аргументов операторы, возвращающие наборы.
  • *Оконные функции `percentile_`** (YMatrix не поддерживает ordered-set агрегаты).
  • Функции обратного распределения.
  • Запросы, выполняющие функции, определённые с атрибутами ON MASTER или ON ALL SEGMENTS.
  • Запросы, содержащие символы Unicode в именах метаданных (например, в именах таблиц), несовместимые с локалью хост-системы.
  • Команды SELECT, UPDATE и DELETE, использующие ключевое слово ONLY при ссылке на имя таблицы.