FROM 子句
FROM 子句指定要读取数据的源:
JOIN 和 ARRAY JOIN 子句也可以用于扩展 FROM 子句的功能。
子查询是另一种 SELECT 查询,可以在 FROM 子句内用括号指定。
FROM 可以包含多个数据源,用逗号分隔,这相当于对它们执行 CROSS JOIN。
FROM 可以选择性地出现在 SELECT 子句之前。这是 ClickHouse 特有的扩展,使得 SELECT 语句更容易阅读。示例:
FINAL 修饰符
当指定 FINAL 时,ClickHouse 会在返回结果之前完全合并数据。这也会执行在给定表引擎的合并期间发生的所有数据转换。
在使用以下表引擎从表中选择数据时适用:
ReplacingMergeTreeSummingMergeTreeAggregatingMergeTreeCollapsingMergeTreeVersionedCollapsingMergeTree
带有 FINAL 的 SELECT 查询是并行执行的。设置 max_final_threads 限制了使用的线程数。
缺点
使用 FINAL 的查询执行速度略慢于不使用 FINAL 的类似查询,因为:
- 数据在查询执行期间被合并。
- 带有
FINAL的查询可能会读取除查询中指定的列以外的主键列。
FINAL 需要额外的计算和内存资源,因为通常在合并时发生的处理必须在查询时在内存中进行。然而,为了生成准确的结果,有时需要使用 FINAL(因为数据可能还没有完全合并)。它的成本低于运行 OPTIMIZE 强制合并。
作为使用 FINAL 的替代方案,有时可以使用不同的查询,假设 MergeTree 引擎的后台进程尚未发生,并通过应用聚合来处理它(例如,丢弃重复项)。如果您需要在查询中使用 FINAL 以获得所需的结果,可以这样做,但要注意所需的额外处理。
FINAL 可以通过 FINAL 设置自动应用于查询中的所有表,使用会话或用户配置文件。
示例用法
使用 FINAL 关键字
将 FINAL 作为查询级别设置使用
将 FINAL 作为会话级别设置使用
实现细节
如果省略 FROM 子句,则数据将从 system.one 表中读取。
system.one 表仅包含一行(该表的作用与其他数据库管理系统中的 DUAL 表相同)。
要执行查询,查询中列出的所有列都从适当的表中提取。任何对于外部查询不需要的列会从子查询中剔除。
如果查询未列出任何列(例如,SELECT count() FROM t),仍然会从表中提取某一列(优先选择最小的列),以计算行数。