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 стандарту. Однако есть важные нюансы:
Information Schema StarRocks базируется на ANSI SQL-92 Information Schema, но дополнен специфическими для StarRocks представлениями и функциями.
Стандартные тесты: Полная поддержка TPC-H и TPC-DS подтверждает высокий уровень совместимости.
Отличия: Некоторые функции, присутствующие в других СУБД, не поддерживаются. Например, 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.
Сессионная область видимости — таблица существует только в рамках текущей сессии.
Обычно удаляются автоматически по завершении сессии.
Не поддерживается создание временных таблиц через асинхронные задачи (SUBMIT TASK).
При даунгрейде кластера с v3.3.1 необходимо вручную очистить все временные таблицы.
Ограничения на возвращаемый результат
StarRocks накладывает определённые ограничения на результирующие наборы:
Ограничение на количество подзапросов: по умолчанию запрос может содержать не более 10 000 подзапросов.
Кодировка: поддерживается только UTF-8.
Тип STRING: внутренне представляет собой VARCHAR максимальной длины (varchar(65533)).
Рекомендации по производительности:
Для больших таблиц (миллиарды строк) запрещается использовать SELECT *.
Для высоконагруженных точечных запросов рекомендуется использовать PreparedStatement.
Оконные функции: могут использоваться только в SELECT-списке и в самой внешней позиции запроса.
GROUP BY: ключи группировки должны иметь порядок, соответствующий ключам сортировки.
Заключение
StarRocks представляет собой мощную OLAP-систему с высоким уровнем совместимости с ANSI SQL-стандартами (прежде всего SQL-92) и гибкой поддержкой диалектов MySQL и Trino. Он предлагает богатый набор аналитических функций (PIVOT, оконные функции, работа с полуструктурированными данными), полную поддержку всех основных типов JOIN и операций над множествами.
При этом существуют ограничения: отсутствие APPLY-оператора, поддержка non-equi JOIN только для INNER JOIN, ограничения на временные таблицы (с v3.3.1) и определённые рамки на сложность запросов. Однако для задач многомерного анализа, реального времени и работы с большими данными StarRocks предоставляет все необходимые инструменты, сохраняя привычный SQL-интерфейс для разработчиков и аналитиков.