ClickHouse笔记
执行计划
explain syntax 执行计划-返回优化后的语法
分析语法
group by 后面可以跟with xxx 进行分析,比如上卷,多维分析,聚合
ClickHouse 自带的优化器
谓词下推:
就是将能提前筛选的条件,提前执行筛选,让匹配的结果集尽量小。
比如having后的条件可以挪到where中执行,where的条件可以挪到子查询中的where中执行等等。
聚合计算外推:
聚合函数中的计算语句会优化到聚合函数外面执行,比如sum(price * 3) 会优化成 sum(price) * 3
聚合函数消除:
group by 的字段,如果使用了max min等函数,会被优化器自动消除,因为没有意义。
手动合并分区
optimize table t_table final
ClickHouse SQL注意事项
1、distinct 底层用的 uniqExact
2、用IN代替join
3、如果两张表都很大,用inner join 代替 left right
4、两张分布式表,in join前要加globa关键词,这样右表只会在接受SQL的节点查询一次,然后将结果分发到其他节点上。如果不加,会在每个节点都发起一次对右表的关联查询,而右表又是分布式的,会导致查询右表被查询N的平方次N是分片数量,导致查询放大。
同步库数据,支持想MySql一样的 Select inster语法
insert into 库1.表1 select * FROM 库2.表2 limit 1000;
insert into so_test.t_table_name_all select * FROM default.t_table_all limit 1000;
删除-表 - 操作集群下所有表
DROP table db_name.table_name ON CLUSTER sys_ck_cluster;
DROP table db_name.table_name ON CLUSTER sys_ck_cluster;
删除-分区
ALTER TABLE db_name.table_name DROP PARTITION '20220101'
删除-条件
ALTER TABLE db_name.table_name DELETE WHERE flow_year = '';
更新-条件
ALTER TABLE db_name.table_name UPDATE update_time= now(), name='zhangsan' WHERE id='100'
操作所有集群
ON CLUSTER sys_ck_cluster // sys_ck_cluster 是集群的名字
在所有集群内创建表
CREATE TABLE so_test.test_table_name ON CLUSTER sys_ck_cluster
(
`id` Int64 COMMENT '系统自动生成id标识',
......................................
)
ENGINE = ReplacingMergeTree(sign)
PARTITION BY toYYYYMM(create_date)
PRIMARY KEY create_date
ORDER BY (create_date)
SETTINGS index_granularity = 8192
在所有集群内创建视图
CREATE TABLE so_test.test_table_name_all ON CLUSTER sys_ck_cluster
(
`id` Int64 COMMENT '系统自动生成id标识',
.....................................
)
ENGINE = Distributed('sys_ck_cluster',
'so_test',
'test_table_name',
sipHash64(flow_id))