ClickHouse优化

执行计划
AST(语法树)、SYNTAX(优化后的SQL语句)、PIPELINE(查看PIPELINE计划,可看线程数)
建表优化
数据类型优化:1.限定好数据类型  2.使用空值会对性能产生负面影响  
    分区索引优化:1.分区按照天分区(一亿分区)  
        2.order by(就是索引列) 查询高的放前面,重复值少的尽量不索引(intHash32(userID))
    表参数:index_granularity = 8192   TTL设置
    写入删除优化:最好不要执行单条、小批量删除和插入操作。一次不要写太多分区。
        2-3/s次写入,2w-5w/次。可能会出现:Too many parts 
        使用WAL预写日志(开启),提高写入性能
资源优化
background_pool_size=16                          //CPU个数的2倍
    background_schedule_pool_size=16                 //CPU个数的2倍
    background_distributed_schedule_pool_size=16     //CPU个数的2倍
    max_concurrent_queries=100                       //150-300 最大并发处理请求
    max_threads=cpu核数                              //单个查询能使用的最大cpu个数
    max_memory_usage       //单个查询的内存,128G的机器设置为100G
    max_bytes_before_external_group_by/max_memory_usage一半,
        group使用内存超过值后会使用磁盘 50G
    max_bytes_before_external_sort/max_memory_usage一半,
        order使用内存超过值后会使用磁盘 50G
    max_table_size_to_drop/删除表的时候超过50G就是报错  0多大就可以删

    存储:固态比机械块2-3倍,提升IO。clickhouse不支持多目录。绑定多块磁盘,挂载虚拟组。
ClickHouse语法优化规则
count 不要写具体的字段
    having 下推到where  /  外部查询自动下推到子查询  /  UNION ALL 后的where 下推到内部
    聚合外推:sum(a *2) 优化成sum(a )*2
    聚合消除:groupby的字段然后求 min,max  优化后会去掉
    标量替换:将sum(aa)/sum(bb)  将aa,bb替换为标量  后面替换回来
    三元运算符:替换为multiIf()
单表查询优化
1.where优化成prewhere  先查询where字段,然后补全对应字段/默认会自动优化
        不能优化的场景:常量表达式,主键字段,where和select相同
    2.采样操作:from table_name SAMPLE 0.1   //采样数据进行操作
    3.列裁剪和分区裁剪
    4.order by 结合where limit 使用
    5.避免构建虚拟列:a列/b列   最好在前端处理
    6.uniqCombined替代distinct 近似去重替代完全去重
    7.使用物化视图
    8.查询时长、关闭虚拟内存、配置join_use_nulls、批量写入的时候先排序(分区)、
        CPU超过50%出现查询波动,CPU70%要关注
多表查询优化
(右全部写入内存,轮询左表)
    1.in 代替 join 
    2.小表在右
    3.谓词下推 join之前进行过滤 提前过滤
    4.分布式表需要使用 GLOBAL
    5.使用字典表(常驻内存)
如何数据一致性
1.grouo by 去重 
    2.FINAL ,查询语句前面加 (部分引擎支持)
物化视图
真正的保存数据。对历史数据进行去重在物化视图里面是不好用的
    create MATERIALIZED view if not exists my_view engine=mergeTree 
    partition by aa order by bb as select ...

搬砖多年终不得要领,遂载源码看之望得真经。