Clickhouse分布式查询和写⼊优化
# clickhouse 查询优化
分布式⼦查询
1.普通的IN/JOIN:查询发送到远程的server,在每个远程的server上运⾏IN⼦查询或JOIN⼦句。
2.GLOBALIN/GLOBALJOIN:⾸先为GLOBALIN/GLOBALJOIN运⾏所有⼦查询,将结果收集在临时表中。然后将临时表发送到每个远端server,并在其中使⽤此临时数据运⾏查询。
普通操作 in
SELECT uniq(UserID) FROM distributed_table WHERE UserID IN ( SELECT UserID FROM distributed_table_in WHERE CounterID=34)
GLOBAL
SELECT uniq(UserID) FROM  distributed_table WHERE UserID GLOBAL IN ( SELECT UserID FROM distributed_table_in WHERE CounterID =34)
使⽤GLOBALIN/GLOBALJOIN注意事项
1.使⽤GLOBALIN创建临时表,数据没有去重。若要减少⽹络传输的数据量,在⼦查询中指定DISTINCT。
2.使⽤GLOBAL时,应尽量避免使⽤⼤数据集。临时表将发送到所有远程的主机,特别是在多机房容灾的集架构下,数据发送⾄远程数据中⼼性能低下。
3.GLOBAL可能会导致⽹络超载。不会限制⽹络带宽。
4.使⽤GLOBAL时,尽量保证副本组驻留在同⼀个数据中⼼,保证快速的⽹络数据传输。
5.为避免GLOBAL导致的数据传输,可提前将全量的数据分发⾄每个节点,并使⽤普通JOIN/IN。
外部聚合/排序优化 max_bytes_before_external_group_by
1. 聚合查询消耗的内存超过max_memory_usage(默认10G)设置的值,导致内存溢出。ClickHouse⽀持将临时数据转储到磁盘以限distinct查询
制GROUPBY期间的内存使⽤。当GROUPBY消耗超过max_bytes_before_external_group_by设置的阈值,ClickHouse将中间数据转储到磁盘。默认值为0,表⽰禁⽤磁盘溢写
2. 聚合有两个阶段,第⼀阶段读取数据并形成中间数据。第⼆阶段合并中间数据。
中间临时数据转储到磁盘是发⽣在第⼀阶段,如果没有数据转储,则第两个阶段使⽤的内存相同。
3. 参数建议 在设置max_bytes_before_external_group_by值时,建议将其设置为max_memory_usage的⼀半。当使⽤分布式查
询,为了保证外部聚合时在远程的server端执⾏,设置distributed_aggregation_memory_efficient为1。
备注:
开启外部排序设置max_bytes_before_external_sort,否则可能会内存不⾜导致查询异常终⽌当启⽤外部聚合,
如果数据没有转储到磁盘,此时,查询的运⾏速度和没有外部聚合时⼀样快。如果中间数据转储到磁盘,
则运⾏时间将延长数倍(⼤约3倍)。⽽外部排序,数据转储到磁盘,性能将明显下降。
三个参数分别设置为20G、10G和40G。1.在命令⾏界⾯设置:
setmax_bytes_before_external_group_by=20000000000;
setmax_bytes_before_external_sort=10000000000;
setmax_memory_usage=40000000000;
2. JDBC设置,在URL添加参数:url?
max_bytes_before_external_group_by=20000000000&max_memory_usage=40000000000
查询优化常⽤经验法则
1. ⼩表放在JOIN的右边
2. 使⽤⼦查询显式设置数据处理的顺序
3. 使⽤IN替换JOIN操作
4. 使⽤字典替换JOIN操作
5. 设置单射属性
6.使⽤Join引擎缓存表。
6. 禁⽤分布式表的⼦查询,使⽤GLOBALIN/JOIN替换或者将⼦查询的表提前分发⾄所有的server作为本地表。
7. 使⽤PREWHERE,谓词下推
8. 避免使⽤SELECT*查询
9. .尽量少⽤或不⽤多表关联。
10.
选择和主键不⼀样的排序键
默认情况下,主键(由PRIMARYKEY指定)跟排序键(ORDERBY)相同,因此,⼤部分情况下,不需要专门指定⼀个PRIMARYKEY⼦句。当使⽤SummingMe rgeTree和AggregatingMergeTree时,可考虑选择和主键不⼀样的排序键。
1.排序键可以修改,主键不能修改。
2.预聚合/增量聚合的key是由排序键指定的。业务逻辑后期可能会更改。
3.查询条件⽆需包括排序键的所有字段。
注意
1. 主键字段是排序键字段的⼦集。例如主键为(A,B),则排序键以(A,B)开头,排序键可为(A,B)或(A,B,C)等。
2. 旧的排序键是新排序键的前缀。修改排序键只能增加排序字段,不能减少排序键字段,例如可修改排序键(A,B)为(A,B,C),但不能修改为(A,C)或(A,C,B)等。
3. 排序键只能添加新加⼊表的列,表中已存在数据的列不能添加到排序健中。
数据⼊库优化
1. 使⽤复制表,能保证数据原⼦写⼊和去重。
2. 限制单个复制表INSERT语句执⾏的频率(建议每秒不超过1个)
3. 以相当⼤的数据块插⼊数据(默认为1048576)。
4. 将数据INSERT到ClickHouse之前,通过分区键对数据进⾏分组。
5. 增加⼊库的并发,⼊库性能线性提升。
6 .⾃定义负载均衡策略,控制数据均衡

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。