INTEGRITY Документация

Ограничения и рекомендации

На этой странице кратко описаны поддерживаемые возможности, ограничения и рекомендации.

Краткий справочник

Возможность Поддерживается Примечания
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 Сбой подключения к пограничному сервису (повтор)

Рекомендации

  1. Включайте фильтры по диапазону времени в WHERE чтобы ограничить объём сканируемых данных.
  2. Используйте конкретные имена столбцов вместо SELECT * для повышения производительности.
  3. Используйте LIMIT чтобы контролировать размер набора результатов.
  4. Используйте функции приближённой агрегации (approx_distinct, approx_median, approx_percentile_cont) вместо точных аналогов на больших наборах данных.
  5. Включите уплотнение в R2 Data Catalog, чтобы уменьшить количество файлов, сканируемых при каждом запросе.
  6. Используйте EXPLAIN чтобы просмотреть план выполнения и убедиться, что применяется predicate pushdown.
  7. Используйте WHERE фильтры при многосторонних объединениях, чтобы уменьшить размер промежуточных результатов. Соединение трех и более больших таблиц без фильтров может превысить лимиты ресурсов.
  8. Соединяйте большие таблицы фактов через таблицы измерений вместо прямого соединения двух больших таблиц фактов. Например, соедините http_requests к firewall_events через общий zones измерения, а не выполнять перекрестное соединение обеих таблиц фактов.
  9. Будьте осторожны с COUNT(DISTINCT) в многосторонних объединениях. Такое сочетание может привести к очень большим промежуточным результатам. Рассмотрите возможность использования approx_distinct() или разбить запрос на более мелкие шаги.
  10. Используйте явные JOIN синтаксис вместо неявных соединений (через запятую FROM) для удобочитаемости и чтобы оптимизатор мог выбрать оптимальный порядок соединений.