FROM 子句
FROM 子句指定读取数据的来源
JOIN 和 ARRAY JOIN 子句也可以用来扩展 FROM 子句的功能。
子查询是 FROM 子句内括号中指定的另一个 SELECT 查询。
FROM 可以包含多个数据源,用逗号分隔,这相当于对它们执行 CROSS JOIN。
FROM 可以选择性地出现在 SELECT 子句之前。这是 ClickHouse 的一项特定扩展,它扩展了标准的 SQL,使 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 表包含一行(此表与在其他 DBMS 中找到的 DUAL 表具有相同的用途)。
要执行查询,将从适当的表中提取查询中列出的所有列。 任何不需要外部查询的列都会从子查询中丢弃。 如果查询未列出任何列(例如,SELECT count() FROM t),则无论如何都会从表中提取一列(首选最小的一列),以便计算行数。