← R2 SQL / r2-sql / reference
Ограничения и рекомендации
На этой странице кратко описаны поддерживаемые возможности, ограничения и рекомендации.
Краткий справочник
| Возможность | Поддерживается | Примечания |
|---|---|---|
| SELECT, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT | Да | |
Псевдонимы столбцов (AS) |
Да | |
| Выражения (CASE, CAST, LIKE, BETWEEN, IN, арифметические операции) | Да | Полная поддержка выражений |
| EXPLAIN | Да | Возвращает план выполнения в виде текста или JSON |
| Скалярные функции | Да | Математика, строки, дата и время, регулярные выражения, криптография, массивы, map, struct, JSON |
| Агрегатные функции | Да | Базовые, приближённые, статистические, битовые, логические, позиционные |
| Приближённые агрегатные функции | Да | approx_distinct, approx_median, approx_percentile_cont, approx_top_k |
| Типы столбцов: структуры, массивы и Map | Да | Нотация с квадратными скобками, get_field(), функции для работы с массивами, функции для работы с map |
CTE (WITH ... AS) |
Да | Может ссылаться на разные таблицы и включать JOIN |
| Соединения JOIN (INNER, LEFT, RIGHT, FULL OUTER, CROSS) | Да | Все стандартные типы соединений |
| Неявные соединения (через запятую в FROM) | Да | |
Подзапросы (IN, NOT IN) |
Да | NOT IN не поддерживается для столбцов, допускающих NULL, используйте NOT EXISTS вместо этого |
Подзапросы (EXISTS, NOT EXISTS) |
Да | шаблоны semi-join и anti-join |
| Скалярные подзапросы | Да | В SELECT, WHERE, HAVING |
| Производные таблицы (подзапросы FROM) | Да | Могут быть вложенными и соединяться. LATERAL производные таблицы не поддерживаются. |
| Самосоединения | Да | Одна и та же таблица с разными псевдонимами |
Оконные функции (OVER) |
Да | Встроенный OVER (...) только, с именем WINDOW предложение не поддерживается |
QUALIFY |
Да | Фильтрация по результату оконной функции |
SELECT DISTINCT / DISTINCT ON |
Да | |
func(DISTINCT ...) |
Да | COUNT, SUM, AVG, и другие агрегатные функции |
Операции над множествами (UNION, UNION ALL, INTERSECT, EXCEPT) |
Да | |
GROUPING SETS / ROLLUP / CUBE |
Да | |
OFFSET |
Нет | |
INSERT / UPDATE / DELETE |
Нет | Только для чтения |
CREATE / DROP / ALTER |
Нет | Только для чтения |
Полный синтаксис SQL см. в справочник по SQL.
Неподдерживаемые возможности SQL
| Возможность | Ошибка |
|---|---|
OFFSET |
unsupported feature: OFFSET clause is not supported |
Именованный WINDOW секция |
unsupported feature: WINDOW clause is not supported |
INSERT / UPDATE / DELETE |
only read-only queries are allowed |
CREATE / DROP / ALTER |
only read-only queries are allowed |
UNNEST / PIVOT / UNPIVOT |
Не поддерживается |
Модификаторы подстановочных знаков (ILIKE, EXCLUDE, EXCEPT, REPLACE, RENAME на *) |
Не поддерживается |
| Вложенные (заключённые в скобки) соединения | Не поддерживается |
LATERAL производные таблицы / LATERAL VIEW |
Не поддерживается |
PERCENTILE_DISC |
Не поддерживается: используйте PERCENTILE_CONT |
Неподдерживаемые шаблоны выражений
| Шаблон | Альтернатива |
|---|---|
NOT IN подзапрос для столбцов, допускающих NULL |
Используйте NOT EXISTS с коррелированным подзапросом вместо этого |
Точные агрегатные функции, такие как COUNT(DISTINCT ...), MEDIAN, PERCENTILE_CONT, ARRAY_AGG, а также STRING_AGG поддерживаются. Для больших наборов данных предпочтительнее использовать приближенные варианты (approx_distinct, approx_median, approx_percentile_cont) для снижения затрат памяти и вычислений. См. Агрегатные функции.
Ограничения времени выполнения
| Ограничение | Подробности |
|---|---|
| Ресурсоёмкие запросы | Во время открытого бета-тестирования запросы, требующие большого объёма памяти или вычислительных ресурсов, могут завершаться по тайм-ауту. Сюда входят многосторонние соединения (три и более больших таблиц), COUNT(DISTINCT) и другие func(DISTINCT ...) в объединениях или столбцах с высокой кардинальностью, ARRAY_AGG / STRING_AGG, операции над множествами с дедупликацией больших объёмов входных данных, оконные функции по большим партициям и большие сортировки или группировки с высокой кардинальностью GROUP BY. Добавьте WHERE фильтры и LIMIT, и предпочитайте approx_* агрегатных функций, чтобы снизить риск тайм-аута. |
| Функции с ограничением по бюджету | MEDIAN, PERCENTILE_CONT, ARRAY_AGG, STRING_AGG, NTH_VALUE используемая в качестве агрегатной функции, любая агрегатная функция с DISTINCT, и оконные функции (включая те, что используются через QUALIFY) заранее ограничиваются по бюджету. R2 SQL оценивает объём памяти, необходимый для выполнения запроса, и отклоняет его с 400 ошибку, если требуется сканировать слишком много данных. Добавьте GROUP BY или WHERE фильтры, чтобы уменьшить количество обрабатываемых строк. |
| Запросы к нескольким таблицам | Поддерживаются соединения JOIN, подзапросы (IN, EXISTS, скалярные, производные таблицы) и многотабличные CTE. Производительность зависит от размера промежуточного результата, поэтому используйте фильтры WHERE для управления селективностью соединений. |
| Партиционированные и непартиционированные таблицы | Поддерживаются как партиционированные, так и непартиционированные таблицы Iceberg. |
| Только формат Parquet | CSV, JSON и другие форматы не поддерживаются. |
| Только для чтения | R2 SQL представляет собой движок запросов, а не базу данных. Запись данных не поддерживается. |
now() / current_time() точность |
Округляется до 10-миллисекундных интервалов и приводится к UTC. |
Типичные коды ошибок
| Код | Значение |
|---|---|
| 40003 | Недопустимый синтаксис SQL |
| 40004 | Недопустимый запрос (неподдерживаемая функция, неизвестный столбец, несоответствие типов) |
| 80001 | Сбой подключения к пограничному сервису (повтор) |
Рекомендации
- Включайте фильтры по диапазону времени в
WHEREчтобы ограничить объём сканируемых данных. - Используйте конкретные имена столбцов вместо
SELECT *для повышения производительности. - Используйте
LIMITчтобы контролировать размер набора результатов. - Используйте функции приближённой агрегации (
approx_distinct,approx_median,approx_percentile_cont) вместо точных аналогов на больших наборах данных. - Включите уплотнение в R2 Data Catalog, чтобы уменьшить количество файлов, сканируемых при каждом запросе.
- Используйте
EXPLAINчтобы просмотреть план выполнения и убедиться, что применяется predicate pushdown. - Используйте
WHEREфильтры при многосторонних объединениях, чтобы уменьшить размер промежуточных результатов. Соединение трех и более больших таблиц без фильтров может превысить лимиты ресурсов. - Соединяйте большие таблицы фактов через таблицы измерений вместо прямого соединения двух больших таблиц фактов. Например, соедините
http_requestsкfirewall_eventsчерез общийzonesизмерения, а не выполнять перекрестное соединение обеих таблиц фактов. - Будьте осторожны с
COUNT(DISTINCT)в многосторонних объединениях. Такое сочетание может привести к очень большим промежуточным результатам. Рассмотрите возможность использованияapprox_distinct()или разбить запрос на более мелкие шаги. - Используйте явные
JOINсинтаксис вместо неявных соединений (через запятуюFROM) для удобочитаемости и чтобы оптимизатор мог выбрать оптимальный порядок соединений.