预计算以一种优化执行查询的格式存储数据,这个特性对于以下几点非常有用:
1、在不是主键的列上运行查询
2、预聚合列,它将减少计算和IO
你可以为一个表定义一个或多个预聚合,在查询分析期间,ClickHouse将选择需要扫描的数据最少的预计算,而无需修改用户提供的查询。
(注:磁盘使用情况:预计算将在内部创建一个新的隐表,这说明将需要更多的IO和磁盘空间。例如,如果预计算定义了不同的主键,那么将复制原始表中的所有数据。)
一、示例
过滤加速,不使用主键或排序键
创建一张表visits_order
CREATE TABLE visits_order
(
`user_id` UInt64,
`user_name` String,
`pages_visited` Nullable(Float64),
`user_agent` String
)
ENGINE = MergeTree()
PRIMARY KEY user_agent
ORDER BY user_id
使用 ALTER TABLE 我们可以对已存在的表添加预计算
ALTER TABLE visits_order ADD PROJECTION user_name_projection (
SELECT * ORDER BY user_name);
ALTER TABLE visits_order MATERIALIZE PROJECTION user_name_projection;
插入数据
INSERT INTO visits_order SELECT
number,
'test',
1.5 * (number / 2),
'Android'
FROM numbers(1, 100);
预计算将允许我们快速地根据user_name进行过滤,即使在原始表中user_name没有定义为PRIMARY_KEY。在查询时,ClickHouse确定如果使用预计算,将处理较少的数据,因为数据是按user_name排序的。
SELECT
*
FROM visits_order
WHERE user_name='test'
LIMIT 2
二、预计算操作
要进行预计算,以下操作少不了。
1.ADD PROJECTION
ALTER TABLE [db].name ADD PROJECTION name ( SELECT <COLUMN LIST EXPR> [GROUP BY] [ORDER BY] )
给表的元数据添加预计算描述。
2.DROP PROJECTION
ALTER TABLE [db].name DROP PROJECTION name
从表元数据中删预计算描述,并从磁盘中删除预计算文件。
3.MATERIALIZE PROJECTION
ALTER TABLE [db.]table MATERIALIZE PROJECTION name IN PARTITION partition_name
该查询在分区partition_name中重建预计算名称
4.CLEAR PROJECTION
ALTER TABLE [db.]table CLEAR PROJECTION name IN PARTITION partition_name
从磁盘删除预计算文件,但不删除描述。
ADD、DROP和CLEAR命令是轻量级的,因为它们只更改元数据或删除文件。此外,它们可以被复制,支持通过ClickHouse Keeper或ZooKeeper同步预计算元数据。