Перейти к содержимому
Последнее обновление

Введение в оптимизатор запросов

Определение одним предложением​

Оптимизатор запросов Doris (Nereids) — это современный оптимизатор запросов, построенный на основе фреймворка Cascades. Он сочетает RBO (оптимизацию на основе правил) и CBO (оптимизацию на основе стоимости), чтобы формировать эффективные планы выполнения сложных запросов.

Обзор статьи​

Перед чтением этой статьи рекомендуется ознакомиться со следующими темами:

  • Основная роль оптимизатора запросов в системе баз данных
  • Основные понятия плана выполнения SQL
  • Различия между оптимизацией на основе правил (RBO) и оптимизацией на основе стоимости (CBO)

В статье последовательно рассматриваются следующие темы:

  • Предпосылки разработки оптимизатора запросов
  • Основные преимущества оптимизатора запросов Doris
  • Общий принцип работы оптимизатора
  • Основные переменные сеанса для настройки

Предпосылки разработки​

Современный оптимизатор запросов сталкивается с тремя категориями задач:

ЗадачаКонкретное проявление
Высокая сложность запросовПользовательские запросы становятся всё сложнее, а сценарии их использования — всё разнообразнее
Строгие требования к работе в реальном времениПользователи ожидают немедленного получения результатов запросов
Высокий темп развитияОптимизатор должен быстро адаптироваться к постоянно возникающим новым требованиям

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

Преимущества оптимизатора запросов Doris​

Оптимизатор запросов Doris имеет существенные преимущества перед прежним оптимизатором в трёх аспектах: он умнее, стабильнее и гибче.

Более умный​

  • Каждая операция оптимизации RBO и CBO явно представлена в виде «правила».
  • Каждое правило задаёт набор шаблонов, описывающих структуру плана запроса. Это позволяет оптимизатору точно определять планы запросов, к которым применима оптимизация.
  • Благодаря этому оптимизатор лучше поддерживает сложные запросы, в том числе с многоуровневой вложенностью подзапросов.

Часть, отвечающая за CBO, основана на передовом фреймворке Cascades и в полной мере использует следующие три категории информации:

  1. Подробная статистика данных
  2. Информация о характеристиках данных
  3. Тщательно настроенная модель стоимости

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

Более стабильный​

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

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

Более гибкий​

Продуманная современная архитектура оптимизатора упрощает добавление правил оптимизации и этапов обработки. Новые возможности можно быстро добавлять в соответствии с постоянно меняющимися требованиями.

Принцип работы оптимизатора​

Общая схема работы​

Принцип работы оптимизатора

Процесс работы оптимизатора можно условно разделить на следующие четыре шага:

ШагЭтапОписание
1Синтаксический анализПреобразование текста SQL в абстрактное синтаксическое дерево (AST). Если SQL корректен, обработка продолжается; в противном случае выдаётся ошибка и обработка прекращается
2Семантический анализПроверка существования таблиц, столбцов и функций, указанных в AST, а также соответствия их использования синтаксическим и семантическим правилам. Если всё корректно, обработка продолжается; в противном случае выдаётся ошибка и обработка прекращается
3Переписывание плана запроса (RBO)Переписывание плана запроса с помощью заранее заданных правил. Распространённые методы включают отсечение столбцов, проталкивание предикатов и отсечение разделов
4Оптимизация плана запроса (CBO)Перебор набора эквивалентных планов в пространстве поиска, оценка стоимости выполнения каждого плана и выбор плана с наименьшей стоимостью в качестве итогового плана выполнения

Цели каждого шага:

  • Синтаксический анализ: убедиться, что текст SQL можно преобразовать в корректное AST.
  • Семантический анализ: убедиться, что объекты, на которые ссылается AST, существуют и используются допустимым образом.
  • Переписывание RBO: повысить скорость выполнения с помощью детерминированных правил.
  • Оптимизация CBO: выбрать оптимальный план выполнения на основе модели стоимости, чтобы обеспечить наиболее эффективное выполнение запроса.

Основные переменные сеанса​

nereids_timeout_second​

ПараметрОписание
НазначениеЗадаёт максимально допустимое время планирования запроса. При превышении этого значения планирование прекращается и возвращается сообщение об ошибке
Значение по умолчанию30s
Сценарий примененияЕсли запрос затрагивает большое количество внешних таблиц или отличается особой сложностью, увеличьте это значение до подходящего уровня, чтобы запрос мог выполняться нормально

Назначение механизма: при планировании запроса система устанавливает блокировки чтения на все таблицы, задействованные в SQL. Основные цели ограничения времени планирования:

  • Поддерживать стабильность кластера
  • Предотвращать чрезмерное потребление ресурсов из-за слишком длительного планирования
  • Избегать конфликтов блокировок

Рекомендации по настройке:

  • При ошибке превышения времени планирования сначала проверьте, не слишком ли сложен SQL и не задействовано ли в нём слишком много таблиц.
  • Если такой сценарий обоснован, увеличьте это значение командой SET nereids_timeout_second = <seconds>;.