如何强制SummingMergeTree进行求和

问题描述 投票:0回答:2

发现一个奇怪的(?)行为:当导入数百 GB 数据时,即使强制优化过程,聚合也会出现延迟。

流程如下:

CREATE TABLE IF NOT EXISTS temp.table
(
    date     Date, 
    session  String, 
    total    Int32
)
ENGINE = SummingMergeTree
ORDER BY ( date, session );

-- Importing '2024-01-01'
INSERT INTO temp.table
SELECT date, session, sum(n) AS total FROM temp.data WHERE date = '2024-01-01' GROUP BY date, session
SETTINGS async_insert = 1;

-- Importing '2024-01-02'
INSERT INTO temp.table
SELECT date, session, sum(n) AS total FROM temp.data WHERE date = '2024-01-02' GROUP BY date, session
SETTINGS async_insert = 1;

-- date = '2024-01-03'
-- date = '2024-01-04'
-- a lote of data ...


-- Run optimiztion process
OPTIMIZE TABLE temp.table FINAL;


-- Final aggregated report
SELECT * FROM temp.table;

我需要最后一个

SELECT
来返回正确的总和,无论需要多长时间。也许有一些技巧可以处理这种情况?当获取的数据多于应有的数据时,这有点令人沮丧。

optimization clickhouse
2个回答
1
投票

请勿将

OPTIMIZE TABLE
用于任何类型的业务逻辑。 (事实上,您很少应该运行该命令。)

在表名称后添加

FINAL
,在查询时,将进行求和:

SELECT * FROM temp.table FINAL;

或者,您可以将

FINAL
作为所有查询的默认行为:

SET final = 1;
SELECT * FROM temp.table;

检查文档:https://clickhouse.com/docs/en/operations/settings/settings#final


0
投票

ORDER BY ( date, session );

意味着

total
字段将为
date
session
字段

的每个值组合进行聚合

对你来说

the correct sum
到底意味着什么? 您期望的金额是多少?

© www.soinside.com 2019 - 2024. All rights reserved.