【问题标题】:How to improve the query speed of clickhouse如何提高clickhouse的查询速度
【发布时间】:2021-04-29 00:17:33
【问题描述】:

在clickhouse中,我想做一个查询操作。查询包含按QJTD1分组,但QJTD1是通过查询字典得到的。声明如下:

`SELECT
IF(
    sale_mode = 'owner',
    dictGetString(
        'dict.dict_sku',
        'dept_id_1',
        toUInt64OrZero(sku_id)
    ),
    dictGetString(
        'dict.dict_shop',
        'dept_id_1',
        toUInt64OrZero(shop_id)
    )
) AS QJTD1,
brand_cd,
coalesce(
    uniq(sd_deal_ord_user_num),
    0
) AS sd_deal_ord_user_num,
0 AS item_uv,
dt
FROM app.test_all
WHERE dt >= '2020-11-01'
AND dt <= '2020-11-30'
and IF(
    sale_mode = 'owner',
    dictGetString(
        'dict.dict_sku',
        'bu_id',
        toUInt64OrZero(sku_id)
    ),
    dictGetString(
        'dict.dict_shop',
        'bu_id',
        toUInt64OrZero(shop_id)
    )
)= '1727' GROUP BY
QJTD1,
brand_cd,
dt
ORDER BY item_pv desc limit 0,
100`

,QJTD1数据歪斜严重,导致查询速度慢。我曾尝试优化索引以提高查询速度。索引如下:sku_id,shop_id....但是没有效果。如何提高查询效率?

【问题讨论】:

    标签: clickhouse


    【解决方案1】:

    CH 总是计算 IF (then & else) 的两个分支。

    你可以使用两阶段分组

    select IF( sale_mode ='owner', ... as QJTD1
    from (  
      select owner, sku_id, dept_id_1, ....
      ...
      group by owner, sku_id, dept_id_1
      )
    group by QJTD1
    

    或者定义字典&lt;injective&gt;true

    https://clickhouse.tech/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-structure/

    显示 id -> 属性图像是否单射的标志。 如果为 true,ClickHouse 可以自动放置在 GROUP BY 之后 用注入子句对字典的请求。通常它 大大减少了此类请求的数量。 默认值:假。

    如果它们是单射的。

    我会测试Union all,然后只计算一次 IF 分支。

    【讨论】:

    • 谢谢你的回答,但是sku_id和shop_id的数据粒度比较细,我试过你的方法,group by sku_id和sku_id的运行时间会更长。我给你看完整代码如下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 2021-11-17
    • 2012-09-01
    • 2019-12-21
    • 1970-01-01
    相关资源
    最近更新 更多