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