跳至主要内容

FROM 子句

FROM 子句指定读取数据的来源

JOINARRAY JOIN 子句也可用于扩展 FROM 子句的功能。

子查询是另一个 SELECT 查询,可以在 FROM 子句中的括号内指定。

FROM 可以包含多个数据源,用逗号分隔,这等效于对它们执行 CROSS JOIN

FROM 可以选择出现在 SELECT 子句之前。这是 ClickHouse 对标准 SQL 的特定扩展,使 SELECT 语句更易于阅读。示例

FROM table
SELECT *

FINAL 修饰符

当指定 FINAL 时,ClickHouse 会在返回结果之前完全合并数据。这还会执行给定表引擎在合并期间发生的所有数据转换。

当从使用以下表引擎的表中选择数据时适用

  • ReplacingMergeTree
  • SummingMergeTree
  • AggregatingMergeTree
  • CollapsingMergeTree
  • VersionedCollapsingMergeTree

带有 FINALSELECT 查询是并行执行的。 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),则无论如何都会从表中提取某些列(首选最小的列),以便计算行数。