FROM 子句
FROM
子句指定读取数据的来源
JOIN 和 ARRAY JOIN 子句也可用于扩展 FROM
子句的功能。
子查询是另一个 SELECT
查询,可以在 FROM
子句中的括号内指定。
FROM
可以包含多个数据源,用逗号分隔,这等效于对它们执行 CROSS JOIN。
FROM
可以选择出现在 SELECT
子句之前。这是 ClickHouse 对标准 SQL 的特定扩展,使 SELECT
语句更易于阅读。示例
FROM table
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
关键字
SELECT x, y FROM mytable FINAL WHERE x > 1;
使用 FINAL
作为查询级设置
SELECT x, y FROM mytable WHERE x > 1 SETTINGS final = 1;
使用 FINAL
作为会话级设置
SET final = 1;
SELECT x, y FROM mytable WHERE x > 1;
实现细节
如果省略 FROM
子句,则将从 system.one
表读取数据。system.one
表恰好包含一行(此表与其他 DBMS 中的 DUAL 表具有相同的用途)。
要执行查询,将从相应的表中提取查询中列出的所有列。任何不需要外部查询的列都会从子查询中剔除。如果查询未列出任何列(例如,SELECT count() FROM t
),则无论如何都会从表中提取某些列(首选最小的列),以便计算行数。