Статья

SQL в StarRocks: стандарты, совместимость, возможности и ограничения

2026-08-10 13:48 Новые
StarRocks – это высокопроизводительная MPP-база данных для OLAP-аналитики, построенная на принципах реляционной модели и стремящаяся к максимальной совместимости с SQL-стандартами. В этой статье мы детально разберём, насколько StarRocks соответствует ANSI SQL, какие конструкции языка поддерживаются, а какие — нет, и какие расширенные возможности предоставляет эта система.

Общая поддержка SQL и реляционной модели

StarRocks поддерживает ANSI SQL-синтаксис и успешно проходит тесты TPC-H и TPC-DS, что подтверждает его высокий уровень совместимости с отраслевыми стандартами. База данных построена на реляционной модели данных: данные организованы в таблицы со строго типизированными колонками, поддерживаются первичные ключи, индексы, представления и материализованные представления.
В основе архитектуры StarRocks лежат:
  • Векторизованный движок, использующий SIMD-инструкции для максимальной производительности.
  • CBO (Cost-Based Optimizer) — оптимизатор на основе стоимости, строящий эффективные планы выполнения сложных запросов.
  • Колоночное хранение, оптимизированное для аналитических сценариев.
StarRocks полностью поддерживает реляционные операции: выборку (SELECT), проекцию (указание колонок в выборке), селекцию (WHERE), различные виды соединений (JOIN), агрегацию (GROUP BY), сортировку (ORDER BY), а также множество операций над множествами.

DDL: поддержка и ограничения

StarRocks поддерживает широкий набор Data Definition Language (DDL) операторов:
Поддерживаемые DDL-конструкции:
  • CREATE — создание баз данных, таблиц (с различными моделями: DUPLICATE KEY, PRIMARY KEY, AGGREGATE), представлений (включая материализованные), внешних каталогов (для Hive, Iceberg, Hudi), функций (включая UDF, UDAF, UDWF).
  • ALTER — изменение схемы таблиц (добавление/удаление колонок, изменение свойств)
  • DROP — удаление объектов
  • TRUNCATE TABLE — очистка таблицы
  • REFRESH — обновление материализованных представлений
  • BACKUP и RESTORE — резервное копирование и восстановление
  • CREATE TABLE AS SELECT (CTAS) — создание таблицы на основе результата запроса (синхронно или асинхронно через SUBMIT TASK)
  • CREATE TABLE LIKE — копирование структуры существующей таблицы
  • CREATE TEMPORARY TABLE — создание временных таблиц (доступно с v3.3.1)
Ограничения DDL:
  • При создании временной таблицы ENGINE должен быть установлен в olap.
  • Генерируемые колонки (generated columns) не поддерживаются в режиме shared-data и на AGGREGATE-таблицах.
  • В некоторых сценариях (например, при репликации из MySQL) поддерживается только TRUNCATE из DDL-операций.

DML: поддержка и ограничения

StarRocks поддерживает основные Data Manipulation Language (DML) операции:
Поддерживаемые DML-конструкции:
  • SELECT — основной оператор запроса с полной поддержкой всех его клауз.
  • INSERT — вставка данных в таблицы.
  • UPDATE — обновление данных по первичному ключу (поддерживается в PRIMARY KEY-таблицах).
  • DELETE — удаление данных.
  • INSERT INTO ... SELECT — вставка результата запроса.
Ограничения DML:
  • UPDATE и DELETE в shared-data кластерах поддерживаются, начиная с v4.0.
  • Неподдерживаемые операции (например, MERGE) отсутствуют.
  • В транзакциях StarRocks поддерживает SELECT, INSERT, UPDATE, DELETE.
Особенности SELECT:
  • Поддерживается ORDER BY ... NULLS FIRST | NULLS LAST.
  • Поддерживается EXCLUDE для исключения колонок из результата (с v4.0).

DCL: поддержка

StarRocks поддерживает Data Control Language (DCL) для управления доступом:
  • Управление пользователями и ролями.
  • Разграничение привилегий на уровне баз данных, таблиц, колонок.
  • Поддержка системных ролей (например, cluster_admin).

Совместимость со стандартами и диалект

StarRocks поддерживает ANSI SQL и в основном соответствует SQL-92 стандарту. Однако есть важные нюансы:
  1. Information Schema StarRocks базируется на ANSI SQL-92 Information Schema, но дополнен специфическими для StarRocks представлениями и функциями.
  2. Стандартные тесты: Полная поддержка TPC-H и TPC-DS подтверждает высокий уровень совместимости.
  3. Отличия: Некоторые функции, присутствующие в других СУБД, не поддерживаются. Например, Oracle-функция DECODE отсутствует — рекомендуется использовать CASE WHEN.
Близость к диалектам
SQL-диалект StarRocks наиболее близок к двум направлениям:
1. MySQL-совместимость
StarRocks использует MySQL-протокол, что позволяет подключаться через MySQL-клиенты и использовать широкий спектр BI-инструментов. Тип VARCHAR поддерживается нативно (в отличие от MySQL, где используется CHAR).
2. Trino/Presto-совместимость
StarRocks 3.x поддерживает Trino-синтаксис — это особенно важно для пользователей, мигрирующих с Trino/Presto. Для переключения используется команда:
SET sql_dialect = 'trino';
С версии 3.3.9 доступна функция TRANSLATE TRINO, позволяющая конвертировать Trino SQL в StarRocks SQL.
Расширенные конструкции и OLAP-функции
StarRocks предоставляет богатый набор расширенных конструкций, характерных для OLAP-систем:
1. PIVOT (с v3.3)
Операция PIVOT преобразует строки в колонки, что полезно для создания сводных таблиц. По сути, это синтаксический сахар над конструкцией SUM(CASE WHEN ... THEN ... END):
SELECT * FROM t1 PIVOT (
SUM(c1) AS sum_c1, AVG(c2) AS avg_c2
FOR c3 IN (1, 2, 3, 4, 5)
);
2. Оконные функции (Window Functions)
Широкий набор оконных функций для аналитики: AVG(), COUNT(), FIRST_VALUE(), LAST_VALUE(), LEAD(), LAG() и другие. Поддерживаются пользовательские оконные функции (UDWF). Оконные функции могут работать с ARRAY-типами.
3. Работа с полуструктурированными данными
StarRocks поддерживает типы ARRAY, JSON, MAP, STRUCT и функции для работы с ними, а также lambda-функции высшего порядка.
4. LATERAL JOIN
Поддерживается LATERAL JOIN, но в текущей реализации только с функцией unnest() для преобразования массива в строки.
Специальные реляционные операции
Поддерживаемые типы JOIN:
· INNER JOIN
· LEFT OUTER JOIN
· RIGHT OUTER JOIN
· FULL OUTER JOIN
· CROSS JOIN
· LEFT SEMI JOIN
· RIGHT SEMI JOIN
· LEFT ANTI JOIN
·RIGHT ANTI JOIN
·SELF JOIN
Equi-Join и Non-Equi-Join:
  • Equi-join (с условием =) поддерживается для всех типов JOIN.
  • Non-equi-join (с условиями !=, >, < и т.д.) поддерживается только для INNER JOIN и требует осторожности из-за высокого потребления ресурсов.
USING-клауза:
Поддерживается синтаксис USING (col1, col2 ...) для JOIN-условий.
APPLY-оператор:
StarRocks не поддерживает APPLY-оператор в том виде, в каком он существует, например, в MS SQL Server. Частичная альтернатива — LATERAL JOIN с unnest().
LATERAL JOIN — это специальный вид соединения. Его ключевая особенность в том, что правая часть JOIN (табличная функция) может ссылаться на столбцы из левой части.
unnest() — это табличная функция. Она принимает на вход массив (или строку, или BITMAP) и "разворачивает" его элементы в отдельные строки результата.
Проще говоря, если у вас есть строка с массивом [80, 85, 87], функция unnest() превратит её в три отдельные строки со значениями 80, 85 и 87.
Например:
SELECT student, score
FROM tests
CROSS JOIN LATERAL UNNEST(scores) AS t (score);

Алгоритмы JOIN

StarRocks в основном использует Hash Join как основной алгоритм соединения. Поддерживаются также Colocate Join для оптимизации соединений на колокализованных данных.
Операции над множествами
StarRocks поддерживает стандартные операции над множествами:
Операция
Особенности
UNION - эквивалент UNION DISTINCT с дедупликацией
UNION ALL - объединение кортежей без дедупликации
INTERSECT - эквивалент INTERSECT DISTINCT
EXCEPT / MINUS - дедупликация результата
Все операторы множеств требуют одинакового количества колонок и совместимых типов данных в каждом SELECT.
Деление (Division): классическая операция реляционного деления не реализована как отдельный оператор, но может быть эмулирована с помощью комбинации других конструкций.
Рекомендации по использованию операторов
Предпочтительные операторы:
  • INNER JOIN — наиболее производительный тип соединения.
  • SEMI / ANTI JOIN — эффективны для проверки наличия/отсутствия данных.
  • Equi-join — предпочтительнее non-equi join.
Операторы, которые следует использовать с осторожностью:
  • CROSS JOIN — может порождать огромные декартовы произведения. Рекомендуется всегда добавлять фильтрующие условия.
  • FULL OUTER JOIN — значительно дороже INNER/LEFT/RIGHT JOIN.
  • Non-equi JOIN — поддерживается только для INNER JOIN и может вызвать переполнение памяти.
Иерархия производительности JOIN-ов (от лучшего к худшему):
Semi Join / Anti Join > Inner Join > Outer Join > Full Outer Join > Cross Join

Временные таблицы

Поддержка временных таблиц появилась с версии 3.3.1:
Особенности:
  • Создаются с ключевым словом TEMPORARY в CREATE TABLE.
  • Доступны только в Default Catalog.
  • При создании обязательно указывать ENGINE = olap.
  • Сессионная область видимости — таблица существует только в рамках текущей сессии.
  • Обычно удаляются автоматически по завершении сессии.
Синтаксис:
CREATE TEMPORARY TABLE [IF NOT EXISTS] [database.]table_name ... ENGINE = olap ...
Ограничения:
  • Не поддерживается создание временных таблиц через асинхронные задачи (SUBMIT TASK).
  • При даунгрейде кластера с v3.3.1 необходимо вручную очистить все временные таблицы.

Ограничения на возвращаемый результат

StarRocks накладывает определённые ограничения на результирующие наборы:
  1. Ограничение на количество подзапросов: по умолчанию запрос может содержать не более 10 000 подзапросов.
  2. Кодировка: поддерживается только UTF-8.
  3. Тип STRING: внутренне представляет собой VARCHAR максимальной длины (varchar(65533)).
  4. Рекомендации по производительности:
  • Для больших таблиц (миллиарды строк) запрещается использовать SELECT *.
  • Для высоконагруженных точечных запросов рекомендуется использовать PreparedStatement.
  1. Оконные функции: могут использоваться только в SELECT-списке и в самой внешней позиции запроса.
  2. GROUP BY: ключи группировки должны иметь порядок, соответствующий ключам сортировки.

Заключение

StarRocks представляет собой мощную OLAP-систему с высоким уровнем совместимости с ANSI SQL-стандартами (прежде всего SQL-92) и гибкой поддержкой диалектов MySQL и Trino. Он предлагает богатый набор аналитических функций (PIVOT, оконные функции, работа с полуструктурированными данными), полную поддержку всех основных типов JOIN и операций над множествами.
При этом существуют ограничения: отсутствие APPLY-оператора, поддержка non-equi JOIN только для INNER JOIN, ограничения на временные таблицы (с v3.3.1) и определённые рамки на сложность запросов. Однако для задач многомерного анализа, реального времени и работы с большими данными StarRocks предоставляет все необходимые инструменты, сохраняя привычный SQL-интерфейс для разработчиков и аналитиков.