跳转到内容
搜索文档

限制与最佳实践

最后更新 查看 MarkdownAgent 设置

本页面总结了受支持的功能、限制和最佳实践。

快速参考

功能 支持 备注
SELECT, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT 是
列别名 (AS) 是
表达式 (CASE, CAST, LIKE, BETWEEN, IN, arithmetic) 是 完全支持表达式
EXPLAIN 是 将执行计划以文本或 JSON 格式返回
标量函数(Scalar functions) 是 数学、字符串、日期时间、正则表达式、加密、数组、映射、结构、JSON
聚合函数(Aggregate functions) 是 基础的、近似的、统计的、位运算的、布尔型的、位置的
近似聚合(Approximate aggregates) 是 approx_distinct, approx_median, approx_percentile_cont, approx_top_k
Struct / Array / Map 列类型 是 方括号表示法, get_field(), 数组函数, map 函数
CTE (WITH ... AS) 是 可引用不同表并可包含 JOIN
JOIN (INNER, LEFT, RIGHT, FULL OUTER, CROSS) 是 所有标准的连接类型
隐式连接 (逗号 FROM) 是
子查询 (IN, NOT IN) 是 NOT IN 不支持在可为空(nullable)的列上使用 — 请改用 NOT EXISTS
子查询 (EXISTS, NOT EXISTS) 是 半连接和反连接模式
标量子查询(Scalar subqueries) 是 用在 SELECT, WHERE, HAVING 中
派生表 (FROM 子查询) 是 可以嵌套和连接。不支持 LATERAL 派生表。
自连接(Self-joins) 是 带有不同别名的同一张表
窗口函数 (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 子查询 请改用带有相关子查询的 NOT EXISTS

支持精确聚合,例如 COUNT(DISTINCT ...)、MEDIAN、PERCENTILE_CONT、ARRAY_AGG 和 STRING_AGG。但在大型数据集上,请优先选择近似替代方法(approx_distinct、approx_median、approx_percentile_cont)以减少内存和计算资源开销。请参阅聚合函数。


运行时约束

约束 详细信息
资源密集型查询 在公开测试(open beta)期间,需要大量内存或计算资源的查询可能会超时。这包括多向连接(三张或更多大表)、跨连接或高基数列的 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() 精度 量化为 10ms 边界并强制转为 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 检查执行计划并验证谓词下推。
  7. 在多向连接时使用 WHERE 过滤器,以减小中间结果的大小。直接连接三个或更多没有过滤器的大表可能会超出资源限制。
  8. 通过维度表连接大型事实表,而不是直接连接两张大型事实表。例如,通过共享的 zones 维度连接 http_requests 和 firewall_events,而不是对这两张事实表进行交叉连接。
  9. 跨多向连接使用 COUNT(DISTINCT) 时要小心。这种组合可能会产生巨大的中间结果。考虑使用 approx_distinct() 或将查询拆分为更小的步骤。
  10. 使用显式的 JOIN 语法代替隐式连接(逗号分隔的 FROM),以提高可读性并确保优化器可以选择最佳的连接顺序。

这篇文档对您有帮助吗?