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

投影

Projections store data in a format that optimizes query execution, this feature is useful for:

  • 在主键之外的列上运行查询
  • 预聚合列,这将减少计算和 IO

您可以为表定义一个或多个投影,在查询分析期间,将由 ClickHouse 选择数据扫描量最少的投影,而不会修改用户提供的查询。

磁盘使用

投影将在内部创建一个新的隐藏表,这意味着将需要更多的 IO 和磁盘空间。 例如,如果投影定义了不同的主键,则原始表中的所有数据将被复制。

您可以在此 页面 查看关于投影如何在内部工作的更多技术细节。

示例:不使用主键的过滤

创建表:

使用 ALTER TABLE,我们可以将投影添加到现有表中:

插入数据:

投影将允许我们快速按 user_name 进行过滤,即使在原始表中 user_name 并未被定义为 PRIMARY_KEY。 在查询时,ClickHouse 判断如果使用投影,将处理更少的数据,因为数据是按 user_name 排序的。

要验证一个查询是否使用了投影,我们可以查看 system.query_log 表。在 projections 字段中,我们可以看到使用的投影名称,如果未使用则为空:

示例:预聚合查询

创建带有投影的表:

插入数据:

我们将执行一个使用 GROUP BY 的首次查询,使用字段 user_agent,该查询将不使用定义的投影,因为预聚合不匹配。

要使用投影,我们可以执行选择部分或所有预聚合和 GROUP BY 字段的查询。

如前所述,我们可以查看 system.query_log 表。在 projections 字段中,我们可以看到使用的投影名称,如果未使用则为空:

正常投影与 _part_offset 字段

创建一个包含正常投影且利用 _part_offset 字段的表:

插入一些示例数据:

使用 _part_offset 作为二级索引

_part_offset 字段保持其值在合并和变更中,从而使其成为二级索引的有价值选项。我们可以在查询中利用这一点:

操作投影

以下操作与 projections 可用:

添加投影

ALTER TABLE [db.]name [ON CLUSTER cluster] ADD PROJECTION [IF NOT EXISTS] name ( SELECT <COLUMN LIST EXPR> [GROUP BY] [ORDER BY] ) - 将投影描述添加到表元数据。

删除投影

ALTER TABLE [db.]name [ON CLUSTER cluster] DROP PROJECTION [IF EXISTS] name - 从表元数据中移除投影描述,并从磁盘中删除投影文件。实现为 mutation

物化投影

ALTER TABLE [db.]table [ON CLUSTER cluster] MATERIALIZE PROJECTION [IF EXISTS] name [IN PARTITION partition_name] - 查询在分区 partition_name 中重建投影 name。实现为 mutation

清除投影

ALTER TABLE [db.]table [ON CLUSTER cluster] CLEAR PROJECTION [IF EXISTS] name [IN PARTITION partition_name] - 从磁盘中删除投影文件而不移除描述。实现为 mutation

命令 ADDDROPCLEAR 是轻量级的,因为它们仅更改元数据或删除文件。

此外,它们是可复制的,通过 ClickHouse Keeper 或 ZooKeeper 同步投影元数据。

备注

投影操作仅支持具有 *MergeTree 引擎的表(包括 复制 变体)。