表格存储服务 CLOUDTABLE-ClickHouse表引擎概述:SummingMergeTree

时间:2025-03-06 17:28:46

SummingMergeTree

SummingMergeTree表引擎用于对主键列进行预先聚合,将所有相同主键的行合并为一行,从而大幅度降低存储空间占用,提升聚合计算性能。

  • 建表语句。
    CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER ClickHouse集群名]
    (
        name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
        name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
        ...
    ) ENGINE = SummingMergeTree([columns])
    [PARTITION BY expr]
    [ORDER BY expr]
    [SAMPLE BY expr]
    [SETTINGS name=value, ...]
  • 使用示例。
    • 创建一个SummingMergeTree表testTable。
      CREATE TABLE testTable(id UInt32,value UInt32)ENGINE = SummingMergeTree() ORDER BY id;
    • testTable表中插入数据。
      INSERT INTO testTable Values(5,9),(5,3),(4,6),(1,2),(2,5),(1,4),(3,8);
      INSERT INTO testTable Values(88,5),(5,5),(3,7),(3,5),(1,6),(2,6),(4,7),(4,6),(43,5),(5,9),(3,6);
    • 在未合并parts查询所有数据。
      SELECT * FROM testTable;

      查询结果。

      ┌─id─┬─value─┐
      │  1 │     6 │
      │  2 │     5 │
      │  3 │     8 │
      │  4 │     6 │
      │  5 │    12 │
      └────┴───────┘
      ┌─id─┬─value─┐
      │  1 │     6 │
      │  2 │     6 │
      │  3 │    18 │
      │  4 │    13 │
      │  5 │    14 │
      │ 43 │     5 │
      │ 88 │     5 │
      └────┴───────┘
    • ClickHouse还没有汇总所有行,需要通过ID进行汇总聚合,需要用到sum和GROUP BY子句。
      SELECT id, sum(value) FROM testTable GROUP BY id;

      查询结果。

      ┌─id─┬─sum(value)─┐
      │  4 │         19 │
      │  3 │         26 │
      │ 88 │          5 │
      │  2 │         11 │
      │  5 │         26 │
      │  1 │         12 │
      │ 43 │          5 │
      └────┴────────────┘
    • 手工执行合并操作。
      OPTIMIZE TABLE testTable;

      查询表数据。

      SELECT * FROM testTable;

      查询结果。

      ┌─id─┬─value─┐
      │  1 │    12 │
      │  2 │    11 │
      │  3 │    26 │
      │  4 │    19 │
      │  5 │    26 │
      │ 43 │     5 │
      │ 88 │     5 │
      └────┴───────┘
      • SummingMergeTree根据ORDER BY排序键作为聚合数据的条件Key。即如果排序key是相同的,则会合并成一条数据,并对指定的合并字段进行聚合。
      • 后台执行合并操作时才会进行数据的预先聚合,而合并操作的执行时机无法预测,所以可能存在部分数据已经被预先聚合、部分数据尚未被聚合的情况。因此,在执行聚合计算时,SQL中仍需要使用GROUP BY子句。
support.huaweicloud.com/devg-cloudtable/cloudtable_01_0312.html