【发布时间】: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'。
它也执行得非常快。这两种操作似乎都没有使用大量内存。但是将joinGet 与ALTER 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,但没有聚合函数(MIN、COUNT、SUM...),那么你做错了。 -
RIGHT JOIN是我们不使用的东西。我们使用LEFT JOIN代替(使用反转表)以保持我们的查询可读。 -
ON buyer_id = id?两个派生表(子查询)都返回一个 ID。你是什么意思?使用多个表时,用它们的表限定所有列。 -
我知道上面所有的 cmets 都没有回答你的问题。这就是为什么它们是 cmets 而不是答案 :-) 我不知道 clickhouse,也不知道 clickhouse 中的突变是什么。但我认为在进行下一步之前,您应该先弄清楚您的问题。
-
您的前 2 个 cmets 是有效积分。为简洁起见,我省略了聚合。按时间分组是我在后期做的一个实验。 group by id 是因为该表是快照表,我们对最新记录感兴趣。但是,我不同意连接键模棱两可,所以我保持原样。我已经相应地更新了问题。
标签: sql analytics clickhouse