ClickHouse预计算

预计算以一种优化执行查询的格式存储数据,这个特性对于以下几点非常有用:

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同步预计算元数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值