跳转到内容
搜索文档

限制与最佳实践

最后更新 查看 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 ...)MEDIANPERCENTILE_CONTARRAY_AGGSTRING_AGG。但在大型数据集上,请优先选择近似替代方法(approx_distinctapprox_medianapprox_percentile_cont)以减少内存和计算资源开销。请参阅聚合函数


运行时约束

约束 详细信息
资源密集型查询 在公开测试(open beta)期间,需要大量内存或计算资源的查询可能会超时。这包括多向连接(三张或更多大表)、跨连接或高基数列的 COUNT(DISTINCT) 和其他 func(DISTINCT ...)ARRAY_AGG / STRING_AGG、对大量输入去重的集合操作、大分区上的窗口函数,以及大规模排序或高基数的 GROUP BY。添加 WHERE 过滤器和 LIMIT,并优先选择 approx_* 聚合以降低超时风险。
受预算控制的函数 MEDIANPERCENTILE_CONTARRAY_AGGSTRING_AGG、用作聚合的 NTH_VALUE、任何带 DISTINCT 的聚合以及窗口函数(包括那些通过 QUALIFY 使用的)都会被预先进行预算控制。R2 SQL 在运行查询之前预估所需的内存,如果需要扫描太多数据,则会以 400 错误拒绝。请添加 GROUP BYWHERE 过滤器来减少处理的行数。
多表查询 支持 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_distinctapprox_medianapprox_percentile_cont)代替精确替代方案。
  5. 在 R2 Data Catalog 中启用压缩,以减少每次查询扫描的文件数量。
  6. 使用 EXPLAIN 检查执行计划并验证谓词下推。
  7. 在多向连接时使用 WHERE 过滤器,以减小中间结果的大小。直接连接三个或更多没有过滤器的大表可能会超出资源限制。
  8. 通过维度表连接大型事实表,而不是直接连接两张大型事实表。例如,通过共享的 zones 维度连接 http_requestsfirewall_events,而不是对这两张事实表进行交叉连接。
  9. 跨多向连接使用 COUNT(DISTINCT) 时要小心。这种组合可能会产生巨大的中间结果。考虑使用 approx_distinct() 或将查询拆分为更小的步骤。
  10. 使用显式的 JOIN 语法代替隐式连接(逗号分隔的 FROM),以提高可读性并确保优化器可以选择最佳的连接顺序。

这篇文档对您有帮助吗?