投影
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 实现。
命令 ADD
、DROP
和 CLEAR
是轻量级的,因为它们仅更改元数据或删除文件。
此外,它们是可复制的,通过 ClickHouse Keeper 或 ZooKeeper 同步投影元数据。
投影操作仅支持使用 *MergeTree
引擎的表(包括 replicated 变体)。