Обзор условных функций
Условные функции — это встроенные функции для реализации условной логики и ветвления в SQL-запросах. Они позволяют выполнять различные операции в зависимости от заданных условий, например выбирать значения, обрабатывать значения NULL и реализовывать логику выбора по нескольким условиям.
Векторизованное выполнение и условные функции
Doris — это движок с векторизованным выполнением. Однако поведение условных функций может показаться неожиданным.
Рассмотрим следующий пример:
mysql> set enable_strict_cast = true;
Query OK, 0 rows affected (0.00 sec)
mysql> select count(
-> if(number < 128 ,
-> cast(number as tinyint),
-> cast(number as String))
-> ) from numbers("number" = "300");
ERROR 1105 (HY000): errCode = 2, detailMessage = (127.0.0.1)[INVALID_ARGUMENT]Value 128 out of range for type tinyint
В этом примере ошибка возникает, хотя приведение к tinyint в функции number < 128 выполняется только при выполнении условия if.
Это связано с тем, как традиционно выполнялись условные функции, такие как if(cond, colA, colB):
- Сначала полностью вычисляются оба выражения:
colAиcolB - Затем на основе значения
condвыбирается и возвращается соответствующий результат
Поэтому, даже если значение colA на практике не используется, полное вычисление colA всё равно приведёт к ошибке.
Функции if, ifnull, case и coalesce ведут себя аналогичным образом.
Обратите внимание, что у таких функций, как LEAST, этой проблемы нет, поскольку для сравнения значений им в любом случае необходимо вычислить все параметры.
Вычисление по короткой схеме
В Doris 4.0.4 мы улучшили логику выполнения условных функций, добавив поддержку вычисления по короткой схеме.
mysql> set short_circuit_evaluation = true;
Query OK, 0 rows affected (0.00 sec)
mysql> select count(
-> if(number < 128 ,
-> cast(number as tinyint),
-> cast(number as String))
-> ) from numbers("number" = "300");
+--------------------------------------------------------------------------+
| count(if(number < 128, cast(number as tinyint), cast(number as String))) |
+--------------------------------------------------------------------------+
| 300 |
+--------------------------------------------------------------------------+
При включённом вычислении по короткой схеме такие функции, как if, ifnull, case и coalesce, во многих случаях позволяют избежать ненужных вычислений, предотвращая ошибки и повышая производительность.
Включение вычисления по короткой схеме
Чтобы включить вычисление по короткой схеме, задайте переменную сеанса:
SET short_circuit_evaluation = true;
Преимущества вычисления по короткой схеме
- Предотвращение ошибок: ветви, которые могли бы вызвать ошибки, не выполняются, если условия исключают их выполнение
- Повышение производительности: вычисляются только действительно необходимые ветви, что сокращает объём ненужных вычислений
- Более интуитивное поведение: поведение условных функций становится ближе к поведению условных конструкций в традиционных языках программирования
Распространённые условные функции
К распространённым условным функциям, для которых полезно вычисление по короткой схеме, относятся:
IF: возвращает одно из двух значений в зависимости от условияIFNULL: возвращает первый аргумент, если он не равен NULL, иначе возвращает второй аргументCASE: предоставляет несколько условных ветвей, аналогично конструкциям switch-caseCOALESCE: возвращает первое значение из списка аргументов, отличное от NULLNULLIF: возвращает NULL, если два аргумента равны, иначе возвращает первый аргумент
Подробные сведения о каждой функции приведены на соответствующих страницах документации.