发现一个奇怪的(?)行为:当导入数百 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
来返回正确的总和,无论需要多长时间。也许有一些技巧可以处理这种情况?当获取的数据多于应有的数据时,这有点令人沮丧。
请勿将
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
ORDER BY ( date, session );
意味着
total
字段将为 date
和 session
字段 的每个值组合进行聚合
对你来说
the correct sum
到底意味着什么?
您期望的金额是多少?