【问题标题】:How do I optimise this ClickHouse DB JOIN query?如何优化此 ClickHouse DB JOIN 查询?
【发布时间】:2021-03-26 09:44:30
【问题描述】:

我正在玩 Clickhouse DB,我想弄清楚为什么下面的查询给了我一个 DB::Exception: Memory limit (for query) exceeded 并且可以使用一些帮助...

SELECT * FROM 
(
    SELECT created_at, rates.car_id, MIN(rates.price) FROM rates  
    WHERE 
        pickup_location_id = 198
        AND created_at = '2020-10-01'
    GROUP BY created_at, car_id 
) r
JOIN cars c2 ON r.car_id = c2.id 

内部查询位几乎立即执行(数百万条记录)并且仅产生 212 个结果。但是,添加 JOIN 会导致查询失败(内存异常,45GB)

看起来 JOIN 发生在整个 rates/cars 上 - 而不是“结果”上?

【问题讨论】:

    标签: join clickhouse


    【解决方案1】:

    CH 使用 HASHJOIN 并将正确的表放入内存中的 HashTable 中。

    如果是内部连接,您可以交换表:

    SELECT * FROM cars c2 JOIN
    (
        SELECT created_at, rates.car_id, MIN(rates.price) FROM rates  
        WHERE 
            pickup_location_id = 198
            AND created_at = '2020-10-01'
        GROUP BY created_at, car_id 
    ) r
    ON r.car_id = c2.id 
    

    【讨论】:

    • 好的,谢谢。这不是需要的内部连接,但无论如何都很高兴。
    • @TjeerdKramer --join_algorithm arg 指定连接算法:'auto'、'hash'、'partial_merge'、'prefer_partial_merge'。 'auto' 尝试动态将 HashJoin 更改为 MergeJoin 以避免内存不足。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多