【问题标题】:UPDATE mutation hangsUPDATE 突变挂起
【发布时间】:2021-02-12 12:55:58
【问题描述】:

我怎样才能确保我提交给 CH 的突变实际运行?

我有一个事实表,我们称之为表 A。它包含 8'904'390 条记录。

我还有一个元数据表,表 B。它包含 14'790'739 条记录。

我有兴趣加入他们以制作更快的桌子。 因此,我创建了一个新表 A + B。它从 A 中选择了列,从 B 中选择了列。

当我用历史数据填充新表时,内存不足。 执行一个与此类似的简单INSERT INTO 语句:

INSERT INTO A+B SELECT
       id,
       time,
       price,
       buyer.gender as buyer_gender
FROM
    (
      SELECT
            id,
            time,
            buyer_ref,
            price
        FROM A
        )
        LEFT JOIN
    (
    SELECT
        ref,
        gender
        FROM B
        ) AS buyer ON buyer_ref = ref

因此,我找到了这个聪明的解决方案,而不是手动分区要插入的数据:
Updating rows with values from another table in ClickHouse

这个想法是首先只用来自 A 的数据填充 A+B 表, 然后用 B 的数据更新它。

我试过跑步

ALTER TABLE A+B UPDATE buyer_gender=joinGet('buyer_join', 'gender', buyer_ref) where buyer_gender=''

查询已执行,一条记录已添加到system.mutations 表中。 我回家24小时后回来,还没完,is_done还是0,A+B表的buyer_gender列没有B的数据。

clickhouse.logs 非常安静:

2021.02.12 11:16:03.631674 [ 153 ] {0e304bff-8563-4219-baf9-27294a84feac} <Debug> executeQuery: (from 172.22.0.1:52862) ALTER TABLE A+B UPDATE buyer_gender=joinGet('buyer_join', 'gender', buyer_id) where gender=''
2021.02.12 11:16:03.641182 [ 153 ] {0e304bff-8563-4219-baf9-27294a84feac} <Information> db_name.A+B: Added mutation: mutation_216.txt
2021.02.12 11:16:03.641210 [ 153 ] {0e304bff-8563-4219-baf9-27294a84feac} <Information> db_name.A+B: Waiting mutation: mutation_216.txt
2021.02.12 11:17:35.873119 [ 154 ] {14b270a0-281a-4d0a-b3be-4ce5059d853d} <Debug> executeQuery: (from 172.22.0.1:36140) select * from system.mutations
2021.02.12 11:17:35.873626 [ 154 ] {14b270a0-281a-4d0a-b3be-4ce5059d853d} <Trace> ContextAccess (default): Access granted: SELECT(database, table, mutation_id, command, create_time, `block_numbers.partition_id`, `block_numbers.number`, parts_to_do_names, parts_to_do, is_done, latest_failed_part, latest_fail_time, latest_fail_reason) ON system.mutations
2021.02.12 11:17:39.557393 [ 154 ] {fdabc8d1-488c-4b47-a35e-afd80f288fa6} <Debug> executeQuery: (from 172.22.0.1:36140) select * from system.mutations Format Vertical
2021.02.12 11:17:39.557868 [ 154 ] {fdabc8d1-488c-4b47-a35e-afd80f288fa6} <Trace> ContextAccess (default): Access granted: SELECT(database, table, mutation_id, command, create_time, `block_numbers.partition_id`, `block_numbers.number`, parts_to_do_names, parts_to_do, is_done, latest_failed_part, latest_fail_time, latest_fail_reason) ON system.mutations

而且 clickhouse.error.logs 中没有包含与此突变相关的任何内容。

我尝试仅使用上面的joinGet 从连接表中的一列从表 A 的查询中进行选择。大约需要10s。 我尝试了一个ALTER TABLE UPDATE 语句,其中我将buyer_gender 列值分配给一个常量字符串'foo'。 它也执行得非常快。这两种操作似乎都没有使用大量内存。但是将joinGetALTER TABLE UPDATE 结合起来似乎永远不会完成,我什至不知道它是否已经开始了。

所以我的问题是如何触发突变? 如果这不可能,那么这个操作和数据量是否超过 24 小时正常?

ClickHouse 服务器版本 20.6.5 修订版 54436

【问题讨论】:

  • 这个:SELECT ... GROUP BY id 看起来不对。表中的 ID 应该唯一标识一行。所以GROUP BY id 应该是完全多余的。这个:SELECT id,... FROM A group by toYYYYMM(time) 看起来更错误 :-) 你把几行(每行都有一个 ID)放在一个组中,那么你怎么能选择一个 ID?您想为组选择哪一个?最高的?最低的?根据经验:如果你有GROUP BY,但没有聚合函数(MINCOUNTSUM...),那么你做错了。
  • RIGHT JOIN 是我们不使用的东西。我们使用LEFT JOIN 代替(使用反转表)以保持我们的查询可读。
  • ON buyer_id = id?两个派生表(子查询)都返回一个 ID。你是什​​么意思?使用多个表时,用它们的表限定所有列。
  • 我知道上面所有的 cmets 都没有回答你的问题。这就是为什么它们是 cmets 而不是答案 :-) 我不知道 clickhouse,也不知道 clickhouse 中的突变是什么。但我认为在进行下一步之前,您应该先弄清楚您的问题。
  • 您的前 2 个 cmets 是有效积分。为简洁起见,我省略了聚合。按时间分组是我在后期做的一个实验。 group by id 是因为该表是快照表,我们对最新记录感兴趣。但是,我不同意连接键模棱两可,所以我保持原样。我已经相应地更新了问题。

标签: sql analytics clickhouse


【解决方案1】:

我最终退后一步,直接在插入 A + B 表中使用 Join 表引擎。这样我们就不需要运行导致“缓慢”突变的更新语句。

由于某种原因,CH 在使用 Join 表引擎而不是旧的 LEFT OUTER JOIN 时更好地管理其内存。

没有回答为什么突变会挂起。

【讨论】:

    猜你喜欢
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 2012-09-06
    相关资源
    最近更新 更多