跳到主要内容
跳到主要内容

FROM 子句

FROM 子句指定从中读取数据的源

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

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

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

FROM 可以选择性地出现在 SELECT 子句之前。这是标准 SQL 的 ClickHouse 特有扩展,使 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),则无论如何都会从表中提取某些列(首选最小的列),以便计算行数。