首页 > 其他分享 >ClickHouse的语句优化策略

ClickHouse的语句优化策略

时间:2023-02-02 10:32:09浏览次数:53  
标签:语句 name times item select user 优化 id ClickHouse


一 使用执行计划

​ClickHouse官网执行计划详解​​ 平常写sql的时候,有时候因为我们的有限的水平,写出的sql很差,ck为我们提供了执行计划查询的方法,通过此,我们可以优化我们的sql

#官网的执行计划查看
EXPLAIN [AST | SYNTAX | PLAN | PIPELINE] [setting = value, ...] SELECT ... [FORMAT ...]

以简单的sql

select  groupArray(item_id) from user prewhere  toYear(times)=2017 group by times;

一 查看执行计划
添加执行计划查看

explain plan select  groupArray(item_id) from user prewhere  toYear(times)=2017 group by times;

ClickHouse的语句优化策略_mysql


查看执行的语法树逻辑

explain AST  select  groupArray(item_id) from user prewhere  toYear(times)=2017 group by times;

ClickHouse的语句优化策略_ci_02


三 使用explain SYNTAX 优化语句

下面是一条很脑的sql

select   item_id  in (select item_id from user ) from user  where toYear(times)=2017;

ClickHouse的语句优化策略_sql_03


在语句前添加一个 explain SYNTAX

explain SYNTAX  select   item_id  in (select item_id from user ) from user  where toYear(times)=2017;

执行可以得到clickhouse帮我们优化后的成果

ClickHouse的语句优化策略_ci_04

select item_id in ((select item_id from user) as _subquery7)from user prewhere toYear(times)=2017;

ClickHouse的语句优化策略_mysql_05


执行优化后的语句,可以看出速度快了接近0.05s,这个效果已经很明显了,如果更复杂的语句,优化后语句效果更明显

二 不要用join

clickhouse的本身适用于单宽表,多表连接性能下降的很快,join可以用其他语句替代这些来代替,因为使用join的话,简直是灾难,即使是要join,也不要把大表放在右边。这是由于clickhouse的反人类设计,进行join时,clickhouse会将右表全部加载到内存里,再一条条匹配,速度就会迅速降低。

下面测试两个表的大小为(暂时不考虑逻辑)

ClickHouse的语句优化策略_ci_06

select a.name,a.city,a.url,a.new_price,b.trade_place   from hotel_name_rank a left join trade_city b on b.name=a.name;

ClickHouse的语句优化策略_数据库_07

select a.name,a.city,a.url,a.new_price,b.trade_place   from hotel_name_rank a right join trade_city b on b.name=a.name;

ClickHouse的语句优化策略_执行计划_08


使用where

select a.name,a.city,a.url,a.new_price,b.trade_place   from hotel_name_rank a, trade_city b where b.name=a.name;

ClickHouse的语句优化策略_sql_09


这是我从尚硅谷课程的截图

ClickHouse的语句优化策略_ci_10

三 使用prewhere替代where

PREWHERE能有效支持过滤,默认是开启的,但仅由系列中的表支持*MergeTree系列引擎

ClickHouse的语句优化策略_sql_11

四 不使用nullable

nullable无法被索引,因此需要,还需要建立特定的文件来标记,因此平常使用建议使用一些标记值替代nullable

五 近似去重

一些实时的领域,如需要去重,distinct太耗时,可以使用uniq

ClickHouse的语句优化策略_mysql_12


标签:语句,name,times,item,select,user,优化,id,ClickHouse
From: https://blog.51cto.com/u_15063934/6033064

相关文章

  • gbase慢sql优化案例
    Sql:selecta.u_id,b.b_id,c.c_id,froma.aaleftjoinb.bbona.uid=b.u_idleftjoinc.cconb.c_id=c.c_idlimit100000; 首先把sql拿到生产测试发现确认......
  • 携程SQL上线流程优化,如何从源头扼杀慢查询?
    一、背景 慢查询指的是数据库中查询时间超过了指定的阈值的SQL,这类SQL通常伴随着执行时间长、服务器资源占用高、业务响应慢等负面影响。随着携程酒店业务的......
  • Unity性能优化(三) 垃圾回收,Garbage Collection,GC
    Unity的内存管理Unity由两部分内存来组成,原生内存(NativeMemory)和托管内存(ManagedMemory)。其中NativeMemory是引擎管理的内存,大家接触的会比较少,而且可操控性也比较......
  • SQL优化
    1,查询语句不要使用select*2,尽量减少子查询,使用关联查询(leftjoin,rightjoin,innerjoin)替换3,减少使用in,notin,用exsists,notexists代替4,or的查询尽量使用union,unio......
  • 浅谈线段树优化建图
    前置知识前言用途方法思想实现例题LuoguP2627[USACO11OPEN]MowingtheLawnG前置知识线段树建图(?)前言接触到线段树优化建图还是因为做"[USACO......
  • 客服系统即时通讯IM开发(六)Glang Gorm 执行原生Sql语句增删改查封装库【唯一客服】网站
    在开发在线客服系统的时候,有某些地方需要使用脚本去批量执行SQL语句,这个时候就需要使用简单的执行SQL的封装函数了查询操作是使用的原生的sql库,没用Gorm,原因是Gorm的RawS......
  • sql优化的几种方法
    在sql查询中为了提高查询效率,我们常常会采取一些措施对查询语句进行sql优化,下面总结的一些方法,有需要的可以参考参考。1.对查询进行优化,应尽量避免全表扫描,首先应考虑在whe......
  • SQL Server批量数据插入SQL语句
    1.INSERTINTOSELECT语句语句形式为:InsertintoTable2(field1,field2,…)selectvalue1,value2,…fromTable1要求目标表Table2必须存在,由于目标表Table2已经存在,所以......
  • hive优化
    hive优化1Fetch抓取Fetch抓取是指,Hive中对某些情况的查询可以不必使用MapReduce计算。例如:SELECT*FROMemployees;在这种情况下,Hive可以简单地读取employee对应的存储目......
  • OKR之剑·实战篇04:OKR执行过程优化的那些关键事
    作者:vivo互联网平台产品研发团队本文是《OKR之剑》系列之实战第4篇——OKR执行过程不是一成不变的,团队和个人在执行中不断优化执行的具体行动,保障OKR的高效执行。......