すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB for ClickHouse:テーブルエンジン

最終更新日:Oct 17, 2024

ApsaraDB for ClickHouseは、MergeTree、Log、Integrations、Specialの4つのファミリーのテーブルエンジンをサポートしています。 このトピックでは、4つのファミリのテーブルエンジンについて説明し、一般的なテーブルエンジンの機能を使用する方法を示す例を示します。

概要

テーブルエンジンはテーブルのタイプを参照します。 ApsaraDB for ClickHouseでは、データの保存方法と読み取り方法、インデックスがサポートされているかどうか、プライマリ /セカンダリレプリケーションがサポートされているかどうかがテーブルエンジンによって決定されます。 次の表に、ApsaraDB for ClickHouseでサポートされているテーブルエンジンを示します。

家族

説明

テーブルエンジン

機能

マージツリー

MergeTreeファミリーのエンジンは、高負荷タスクに適しています。 これらの強力な汎用エンジンを使用すると、大量のデータを高速に挿入し、その後のデータ処理をサポートできます。

このファミリのエンジンは、データレプリケーション、パーティション分割、データサンプリングなどの機能をサポートしています。

マージツリー

このテーブルエンジンは、大量のデータをテーブルに挿入します。 データは、部分ごとにテーブルにすばやく挿入されます。 次に、ルールに基づいてパーツがマージされます。

データレプリケーション

このテーブルエンジンは、あるノードから別のノードにデータを複製し、データの一貫性を保証します。

カスタム分割キー

このテーブルエンジンを使用すると、データのパーティションをカスタマイズし、ビジネス要件に基づいてパーティションキーを定義して、データをさまざまなパーティションに分散できます。

ReplacingMergeTree

このテーブルエンジンは、同じ主キーを持つ重複を削除します。 MergeTreeテーブルエンジンはこの機能をサポートしていません。

CollapsingMergeTree

このテーブルエンジンでは、Sign列をCREATE table文に追加できます。 これにより、ReplacingMergeTreeテーブルエンジンの次の制限がなくなります。

  • 分散シナリオでは、同じ主キーを有するデータは、異なるノードに分散され得る。 異なるシャード間のデータの重複は削除できません。

  • OPTIMIZEステートメントの実行が完了する前に、同じ主キーを持つ重複は削除できません。 たとえば、一部のデータでは重複が削除されますが、他のデータでは同じ主キーを持つ重複は削除されません。

  • OPTIMIZE文はバックグラウンドで実行され、実行時間は予測できません。

  • 大量のデータが存在するシナリオでは、OPTIMIZEステートメントを手動で実行するのに長い時間が必要です。 この場合、リアルタイムクエリの要件を満たすことができません。

VersionedCollapsingMergeTree

このテーブルエンジンでは、Version列をCREATE table文に追加できます。 これにより、行が誤った順序で挿入された場合、CollapsingMergeTreeテーブルエンジンが期待どおりに行を縮小または削除できないという問題を解決できます。

SummingMergeTree

このテーブルエンジンは、主キー列を事前に集約し、同じ主キーを持つすべての行を1つの行に結合します。 これにより、ストレージ使用量が削減され、集約パフォーマンスが向上します。

AggregatingMergeTree

このテーブルエンジンは事前集計エンジンであり、集計パフォーマンスを向上させるために使用されます。 さまざまな集計関数を使用できます。

GraphiteMergeTree

このテーブルエンジンは、Graphiteデータの保存と要約に使用されます。 これにより、ストレージスペースが削減され、Graphiteデータのクエリ効率が向上します。

おおよその最も近い近隣検索インデックス

このデータエンジンは、近似最近傍探索のためのインデックスエンジンであり、大規模データセットにおいて所与のクエリ点に最も近いデータ点を効率的に探索する。

反転インデックスを使用したフルテキスト検索

このデータエンジンは、全文検索に転置インデックスを使用し、大規模テキストデータの全文検索に使用されます。

ログ

Logファミリのエンジンは、約100万行を含む小さなテーブルにデータをすばやく書き込み、すべてのデータを読み取る必要があるシナリオに適しています。

次のセクションでは、このファミリのエンジンの一般的な機能について説明します。

  • データは追加され、ディスクに書き込まれる。

  • DELETEおよびUPDATE操作はサポートされていません。

  • インデックスはサポートされていません。

  • データをアトミックに書き込むことはできません。

  • INSERT操作はSELECT操作をブロックします。

TinyLog

このテーブルエンジンは、データファイルの同時読み取りをサポートせず、クエリのパフォーマンスが低下します。 このテーブルエンジンは単純な形式を使用し、中間データを一時的に格納するのに適しています。

StripeLog

このテーブルエンジンは、データファイルの同時読み取りをサポートし、TinyLogよりも高いクエリパフォーマンスを提供します。 ファイル数を減らすために、すべての列は大きなファイルに格納されます。

ログ

このテーブルエンジンは、データファイルの同時読み取りをサポートし、TinyLogよりも高いクエリパフォーマンスを提供します。 各列は別々のファイルに保存されます。

統合

Integrationsファミリーのエンジンは、外部データをApsaraDB for ClickHouseにインポートしたり、ApsaraDB for ClickHouseの外部データソースを使用したりするのに適しています。

Kafka

このテーブルエンジンは、KafkaトピックからApsaraDB for ClickHouseにデータをインポートします。

MySQL

このテーブルエンジンは、ストレージエンジンとしてMySQLを使用し、ApsaraDB for ClickHouseのMySQLテーブルに対してSELECTなどの操作を実行します。

JDBC

このテーブルエンジンは、Java Database Connectivity (JDBC) 接続文字列を使用してデータソースを読み取ります。

ODBC

このテーブルエンジンは、ODBC (Open Database Connectivity) 接続文字列を使用してデータソースを読み取ります。

HDFS

このテーブルエンジンは、HDFS (Hadoop Distributed File System) 上の指定された形式のデータファイルを読み取ります。

Special

Specialファミリのエンジンは、特定のシナリオに適しています。

分散

このテーブルエンジンはデータを保存しませんが、複数のサーバーで分散クエリをサポートします。

MaterializedView

このテーブルエンジンは、マテリアライズドビューの作成に使用されます。

辞書

このテーブルエンジンは、辞書データをApsaraDB for ClickHouseテーブルとして表示します。

マージ

このテーブルエンジンはデータを保存しませんが、他のテーブルから同時にデータを読み取ることができます。

ファイル

このテーブルエンジンは、ローカルファイルをデータストレージとして使用します。

NULL

このテーブルエンジンは、Nullテーブルに書き込まれたデータを破棄します。 データがNullテーブルから読み取られた場合、応答は空です。

設定する

このテーブルエンジンは常にランダムアクセスメモリ (RAM) にデータを格納します。

参加

このテーブルエンジンは常にRAMにデータを保存します。

URL

このテーブルエンジンは、リモートHTTPおよびHTTPSサーバー上のデータを管理します。

表示

このテーブルエンジンはデータを保存しません。 このテーブルエンジンには、指定されたSELECTクエリのみが格納されます。

メモリ

このテーブルエンジンはRAMにデータを保存します。サーバーの再起動後にデータが失われます。 このテーブルエンジンは、優れたクエリパフォーマンスを提供します。 このテーブルエンジンは、100万未満の行を含み、データ永続化要件がない小さなテーブルをクエリするのに適しています。 ApsaraDB for ClickHouseでは、ほとんどの場合、このテーブルエンジンは一時テーブルのクエリに使用されます。

Buffer 型

このテーブルエンジンは、宛先テーブルのメモリバッファを構成するために使用されます。 バッファが指定された条件を満たす場合、データはディスクにフラッシュされます。

説明

テーブルエンジンの詳細については、「テーブルエンジン」をご参照ください。

マージツリー

MergeTreeテーブルエンジンは、大量のデータを分析するために使用できます。 テーブルエンジンは、データの分割、保存されたデータの並べ替え、プライマリキーインデックス、スパースインデックス、およびデータの有効期間 (TTL) をサポートします。 MergeTreeテーブルエンジンは、ApsaraDB for ClickHouseのすべてのSQL構文をサポートしますが、一部の機能は標準SQLの機能とは異なります。

この例では、主キーを使用して特徴の違いを示します。 ApsaraDB for ClickHouseのSQL構文では、プライマリキーを使用して重複を削除し、データが一意になるようにします。 MergeTreeテーブルエンジンでは、主キーを使用してクエリを高速化します。 コンパクションが完了した後でも、同じ主キーを持つデータ行はまだ存在します。

説明

MergeTreeテーブルエンジンの詳細については、「MergeTree」をご参照ください。

次の例は、MergeTreeテーブルエンジンの使用方法を示しています。

  1. test_tblという名前のテーブルを作成します。 主キーは (id, create_time) です。 格納されたデータは主キーに基づいてソートされ、create_timeの値に基づいてパーティション分割されます。

    CREATE TABLE test_tbl ON CLUSTER default (
      id UInt16,
      create_time Date,
      comment Nullable(String)
    ) ENGINE = MergeTree()
       PARTITION BY create_time
         ORDER BY  (id, create_time)
         PRIMARY KEY (id, create_time)
         SETTINGS index_granularity=8192;
  2. 主キーが重複しているデータを書き込みます。

    insert into test_tbl values(1, '2019-12-13', null);
    insert into test_tbl values(1, '2019-12-13', null);
    insert into test_tbl values(2, '2019-12-14', null);
    insert into test_tbl values(3, '2019-12-15', null);
    insert into test_tbl values(3, '2019-12-15', null);
  3. データの照会

    select * from test_tbl;

    次のクエリ結果が返されます。

    ┌─id─┬─create_time─┬─comment──┐
    │  1 │ 2019-12-13  │   NULL   │
    │  1 │ 2019-12-13  │   NULL   │
    │  2 │ 2019-12-14  │   NULL   │
    │  3 │ 2019-12-15  │   NULL   │
    │  3 │ 2019-12-15  │   NULL   │
    └────┴─────────────┴──────────┘
  4. OPTIMIZE文を実行して, バックグラウンドで強制的にコンパクションを実行します。 圧縮が強制的に実行されるのは、MergeTreeファミリのテーブルエンジンがログ構造のマージツリー (LSMツリー) に似た構造を使用し、ストレージ層の処理ロジックが圧縮フェーズが開始されるまで実装されないためです。

    optimize table test_tbl final;
  5. データを再度照会します。

    select * from test_tbl;

    次のクエリ結果が返されます。 主キーが重複しているデータはまだ存在します。

    ┌─id─┬─create_time─┬─comment──┐
    │  1 │ 2019-12-13  │   NULL   │
    │  1 │ 2019-12-13  │   NULL   │
    │  2 │ 2019-12-14  │   NULL   │
    │  3 │ 2019-12-15  │   NULL   │
    │  3 │ 2019-12-15  │   NULL   │
    └────┴─────────────┴──────────┘

ReplacingMergeTree

ApsaraDB for ClickHouseは、同じプライマリキーを持つ重複を削除するためのReplacingMergeTreeテーブルエンジンを提供します。 これにより、MergeTreeテーブルエンジンがこの機能をサポートしていないという問題を解決できます。

ReplacingMergeTreeテーブルエンジンでは、同じ主キーを持つ重複を削除できますが、テーブルエンジンには次の制限があります。 したがって、ReplacingMergeTreeテーブルエンジンを使用して、データの重複が最終的に削除されるようにしますが、クエリプロセス中にプライマリキーが一意になるようにすることはできません。

  • 分散シナリオでは、同じ主キーを有するデータは、異なるノードに分散され得る。 異なるシャード間のデータの重複は削除できません。

  • OPTIMIZEステートメントの実行が完了する前に、同じ主キーを持つ重複は削除できません。 たとえば、一部のデータでは重複が削除されますが、他のデータでは同じ主キーを持つ重複は削除されません。

  • OPTIMIZE文はバックグラウンドで実行され、実行時間は予測できません。

  • 大量のデータが存在するシナリオでは、OPTIMIZEステートメントを手動で実行するのに長い時間が必要です。 この場合、リアルタイムクエリの要件を満たすことができません。

説明

ReplacingMergeTreeテーブルエンジンの詳細については、「ReplacingMergeTree」をご参照ください。

次の例は、ReplacingMergeTreeテーブルエンジンの使用方法を示しています。

  1. test_tbl_replacingという名前のテーブルを作成します。

    CREATE TABLE test_tbl_replacing (
      id UInt16,
      create_time Date,
      comment Nullable(String)
    ) ENGINE = ReplacingMergeTree()
       PARTITION BY create_time
         ORDER BY  (id, create_time)
         PRIMARY KEY (id, create_time)
         SETTINGS index_granularity=8192;
  2. 主キーが重複しているデータを書き込みます。

    insert into test_tbl_replacing values(1, '2019-12-13', null);
    insert into test_tbl_replacing values(1, '2019-12-13', null);
    insert into test_tbl_replacing values(2, '2019-12-14', null);
    insert into test_tbl_replacing values(3, '2019-12-15', null);
    insert into test_tbl_replacing values(3, '2019-12-15', null);
  3. データの照会

    select * from test_tbl_replacing;

    次のクエリ結果が返されます。

    ┌─id─┬─create_time─┬─comment──┐
    │  1 │ 2019-12-13  │   NULL   │
    │  1 │ 2019-12-13  │   NULL   │
    │  2 │ 2019-12-14  │   NULL   │
    │  3 │ 2019-12-15  │   NULL   │
    │  3 │ 2019-12-15  │   NULL   │
    └────┴─────────────┴──────────┘ 
  4. OPTIMIZE文を実行して, バックグラウンドで強制的にコンパクションを実行します。 MergeTreeファミリのテーブルエンジンはLSMツリーに似た構造を使用し、ストレージ層の処理ロジックはコンパクションフェーズが開始されるまで実装されないため、コンパクションが強制的に実行されます。

    optimize table test_tbl_replacing final;
  5. データを再度照会します。

    select * from test_tbl_replacing;

    次のクエリ結果が返されます。 主キーが重複しているデータは削除されます。

    ┌─id─┬─create_time─┬─comment──┐
    │  1 │ 2019-12-13  │   NULL   │
    │  2 │ 2019-12-14  │   NULL   │
    │  3 │ 2019-12-15  │   NULL   │
    └────┴─────────────┴──────────┘     

CollapsingMergeTree

CollapsingMergeTreeテーブルエンジンにより、ReplacingMergeTreeテーブルエンジンの機能の制限がなくなります。 CollapsingMergeTreeテーブルエンジンを使用する場合は、CREATE tableステートメントでSign列を指定する必要があります。 行は、Sign列の値に基づいて、state rowとcancel rowの2つのカテゴリに分けられます。 Sign列の値が1行は、状態行と呼ばれます。 状態行は状態を追加するために使用されます。 Sign列の値が -1である行は、キャンセル行と呼ばれます。 キャンセル行は状態を削除するために使用されます。

説明

CollapsingMergeTreeテーブルエンジンは、同じ主キーを持つ行をリアルタイムで削除できます。 状態が継続的に変化し、複数のスレッドを使用して行が並行して書き込まれる場合、状態行とキャンセル行は順序が乱れ、期待どおりに折りたたまれたり削除されたりできない可能性があります。

バックグラウンドでの圧縮中に、同じ主キーと反対のSign値を持つ行が折りたたまれるか削除されます。 コンパクションが実行されない場合、state行とcancel行が同時に存在します。 同じ主キーを持つ行を折りたたむか削除するには、ビジネス層で次の操作を実行します。

  • 状態を削除する前に、元の状態行の値を記録するか、データベースを照会して元の状態行の値を取得します。

    その理由は、状態を削除するときにキャンセル行を記述する必要があるためです。 Cancel行には、Sign列を除いて、元の状態の行の主キーと同じ主キーを持つデータが含まれている必要があります。

  • count()sum(col) などの集計関数を実行すると、データの冗長性が存在する場合があります。 有効な結果を取得するには、ビジネス層でSQL文を変更します。 count()sum(Sign) に、sum(col)sum(col * Sign) に変更します。

    次の理由があります。

    • バックグラウンドでコンパクションを実行する時間は予測できません。 クエリを開始すると、状態行とキャンセル行が折りたたまれたり削除されたりすることはありません。

    • ApsaraDB for ClickHouseは、同じプライマリキーを持つ行が同じノードに収まるようにすることはできません。 ノード間でデータを縮小または削除することはできません。

説明

CollapsingMergeTreeテーブルエンジンの詳細については、「CollapsingMergeTree」をご参照ください。

次に、CollapsingMergeTreeテーブルエンジンの使用例を示します。

  1. test_tbl_colflapingという名前のテーブルを作成します。

    CREATE TABLE test_tbl_collapsing
    (
        UserID UInt64,
        PageViews UInt8,
        Duration UInt8,
        Sign Int8
    )
    ENGINE = CollapsingMergeTree(Sign)
    ORDER BY UserID;
  2. Sign列の値が1である状態行を挿入します。

    INSERT INTO test_tbl_collapsing VALUES (4324182021466249494, 5, 146, 1);
    説明

    キャンセル行を挿入してからステート行を挿入すると、キャンセル行とステート行が故障している可能性があります。 この場合、バックグラウンドで強制的にコンパクションを行っても、同一の主キーを持つデータを破棄または削除することはできません。

  3. Sign列の値が -1であるキャンセル行を挿入します。 キャンセル行の値は、Sign列の値を除いて、挿入された状態行の値と同じです。 同時に、キャンセル行と同じ主キーを持つ新しい状態行を挿入します。

    INSERT INTO test_tbl_collapsing VALUES (4324182021466249494, 5, 146, -1), (4324182021466249494, 6, 185, 1);
  4. データの照会

    SELECT * FROM test_tbl_collapsing;

    次のクエリ結果が返されます。

    ┌────────UserID───────┬─PageViews─┬─Duration─┬─Sign──┐ 
    │ 4324182021466249494 │    5      │    146   │   1   │ 
    │ 4324182021466249494 │    5      │    146   │  -1   │ 
    │ 4324182021466249494 │    6      │    185   │   1   │ 
    └─────────────────────┴───────────┴──────────┴───────┘
  5. 指定した列で集計関数を実行する場合は、SQL文を変更して有効な結果を取得します。 この例では、集計関数sum(col) が使用され、SQL文は次の文に変更されます。

    SELECT
        UserID,
        sum(PageViews * Sign) AS PageViews,
        sum(Duration * Sign) AS Duration
    FROM test_tbl_collapsing
    GROUP BY UserID
    HAVING sum(Sign) > 0;

    データが集計されると、次のクエリ結果が返されます。

    ┌────────UserID───────┬─PageViews─┬─Duration──┐ 
    │ 4324182021466249494 │    6      │    185    │ 
    └─────────────────────┴───────────┴───────────┘
  6. OPTIMIZE文を実行して, バックグラウンドで強制的にコンパクションを実行します。 MergeTreeファミリのテーブルエンジンはLSMツリーに似た構造を使用し、ストレージ層の処理ロジックはコンパクションフェーズが開始されるまで実装されないため、コンパクションが強制的に実行されます。

    optimize table test_tbl_collapsing final;
  7. データを再度照会します。

    SELECT * FROM test_tbl_collapsing;

    次のクエリ結果が返されます。

    ┌────────UserID───────┬─PageViews─┬─Duration─┬─Sign──┐  
    │ 4324182021466249494 │    6      │    185   │   1   │ 
    └─────────────────────┴───────────┴──────────┴───────┘

VersionedCollapsingMergeTree

CollapsingMergeTreeテーブルエンジンは、行が誤った順序で挿入された場合、期待どおりに行を縮小または削除できません。 この問題を解決するために、ApsaraDB for ClickHouseには、Version列をCREATE tableステートメントに追加できるVersionedCollapsingMergeTreeテーブルエンジンが用意されています。 バージョン列は、行が誤った順序で挿入された場合に、状態行とキャンセル行との間のマッピングを記録するために使用されます。 バックグラウンドでの圧縮中に、同じ主キー、同じVersion値、および反対のSign値を持つ行が折りたたまれるか、削除されます。

CollapsingMergeTreeテーブルエンジンと同様に、count()sum(col) などの集計関数を実行するときに、ビジネス層でSQL文を変更します。 count()sum(Sign) に、sum(col)sum(col * Sign) に変更します。

説明

VersionedCollapsingMergeTreeテーブルエンジンの詳細については、「VersionedCollapsingMergeTree」をご参照ください。

次の例は、VersionedCollapsingMergeTreeテーブルエンジンの使用方法を示しています。

  1. test_tbl_Versionedという名前のテーブルを作成します。

    CREATE TABLE test_tbl_Versioned
    (
        UserID UInt64,
        PageViews UInt8,
        Duration UInt8,
        Sign Int8,
        Version UInt8
    )
    ENGINE = VersionedCollapsingMergeTree(Sign, Version)
    ORDER BY UserID;
  2. Sign列の値が -1であるキャンセル行を挿入します。

    INSERT INTO test_tbl_Versioned VALUES (4324182021466249494, 5, 146, -1, 1);
  3. Sign列の値が1で、Version列の値が1である状態行を挿入します。 他の列の値は、挿入されるキャンセル行の値と同じです。 同時に、キャンセル行と同じ主キーを持つ新しい状態行を挿入します。

    INSERT INTO test_tbl_Versioned VALUES (4324182021466249494, 5, 146, 1, 1),(4324182021466249494, 6, 185, 1, 2);
  4. データの照会

    SELECT * FROM test_tbl_Versioned;

    次のクエリ結果が返されます。

    ┌────────UserID───────┬─PageViews─┬─Duration─┬─Sign───┬Version─┐ 
    │ 4324182021466249494 │    5      │    146   │  -1    │    1   │
    │ 4324182021466249494 │    5      │    146   │   1    │    1   │
    │ 4324182021466249494 │    6      │    185   │   1    │    2   │
    └─────────────────────┴───────────┴──────────┴────────┴────────┘
  5. 指定した列で集計関数を実行する場合は、SQL文を変更して有効な結果を取得します。 この例では、集計関数sum(col) が使用され、SQL文は次の文に変更されます。

    SELECT
        UserID,
        sum(PageViews * Sign) AS PageViews,
        sum(Duration * Sign) AS Duration
    FROM test_tbl_Versioned
    GROUP BY UserID
    HAVING sum(Sign) > 0;

    データが集計されると、次のクエリ結果が返されます。

    ┌────────UserID───────┬─PageViews─┬─Duration─┐ 
    │ 4324182021466249494 │    6      │    185   │
    └─────────────────────┴───────────┴──────────┘
  6. OPTIMIZE文を実行して, バックグラウンドで強制的にコンパクションを実行します。 MergeTreeファミリのテーブルエンジンはLSMツリーに似た構造を使用し、ストレージ層の処理ロジックはコンパクションフェーズが開始されるまで実装されないため、コンパクションが強制的に実行されます。

    optimize table test_tbl_Versioned final;
  7. データを再度照会します。

    SELECT * FROM test_tbl_Versioned;

    次のクエリ結果が返されます。

    ┌────────UserID───────┬─PageViews─┬─Duration─┬─Sign───┬Version─┐ 
    │ 4324182021466249494 │    6      │    185   │   1    │    2   │
    └─────────────────────┴───────────┴──────────┴────────┴────────┘

SummingMergeTree

SummingMergeTreeテーブルエンジンは、主キー列を事前に集計し、同じ主キーを持つすべての行を1つの行に結合します。 これにより、ストレージ使用量が削減され、集約パフォーマンスが向上します。

SummingMergeTreeテーブルエンジンを使用する前に、次の点に注意してください。

  • ApsaraDB for ClickHouseでは、プライマリキー列は、バックグラウンドでコンパクションが実行された場合にのみ事前集計されます。 コンパクションを実行する時間は予測できません。 したがって、いくつかのデータは事前に集約され得るが、いくつかのデータは事前に集約され得ない。 GROUP BY句は、集計を実行するためにSQL文で引き続き必要です。

  • 事前集計中、ApsaraDB for ClickHouseは主キー列を除くすべての列を事前集計します。 NUMERICデータ型の列など、これらの列を集計できる場合、値は合計されます。 STRINGデータ型の列など、列を集計できない場合は、ランダムな値が使用されます。

  • SummingMergeTreeテーブルエンジンをMergeTreeテーブルエンジンと組み合わせて使用することを推奨します。 MergeTreeテーブルエンジンは完全なデータを保存し、SummingMergeTreeテーブルエンジンは事前に集計された結果を保存します。

説明

SummingMergeTreeテーブルエンジンの詳細については、「SummingMergeTree」をご参照ください。

次の例は、SummingMergeTreeテーブルエンジンの使用方法を示しています。

  1. test_tbl_summingという名前のテーブルを作成します。

    CREATE TABLE test_tbl_summing
    (
        key UInt32,
        value UInt32
    )
    ENGINE = SummingMergeTree()
    ORDER BY key;
  2. データを書き込みます。

    INSERT INTO test_tbl_summing Values(1,1),(1,2),(2,1);
  3. データの照会

    select * from test_tbl_summing;

    次のクエリ結果が返されます。

    ┌─key─┬value─┐
    │  1  │  1   │
    │  1  │  2   │
    │  2  │  1   │
    └─────┴──────┘    
  4. OPTIMIZE文を実行して, バックグラウンドで強制的にコンパクションを実行します。 MergeTreeファミリのテーブルエンジンはLSMツリーに似た構造を使用し、ストレージ層の処理ロジックはコンパクションフェーズが開始されるまで実装されないため、コンパクションが強制的に実行されます。

    optimize table test_tbl_summing final;
  5. バックグラウンドで強制的にコンパクションを実行した後、GROUP BY句を含むステートメントを実行してデータを集計します。 次に、データを再度照会します。

    SELECT key, sum(value) FROM test_tbl_summing GROUP BY key;

    次のクエリ結果が返されます。 主キーが重複するデータが集約されました。

    ┌─key─┬value─┐
    │  1  │  3   │
    │  2  │  1   │
    └─────┴──────┘

AggregatingMergeTree

AggregatingMergeTreeテーブルエンジンは、事前集計エンジンであり、集計パフォーマンスを向上させるために使用されます。 SummingMergeTreeテーブルエンジンは、非プライマリキー列を集計するためにsum関数を使用します。 SummingMergeTreeテーブルエンジンと比較して、AggregatingMergeTreeテーブルエンジンでは、さまざまな集計関数を使用できます。

AggregatingMergeTreeテーブルエンジンの構文は複雑です。 AggregatingMergeTreeテーブルエンジンは、マテリアライズドビューまたはApsaraDB for ClickHouseの特別なデータ型AggregateFunctionと組み合わせて使用する必要があります。

説明

AggregatingMergeTreeテーブルエンジンの詳細については、「AggregatingMergeTree」をご参照ください。

次に、AggregatingMergeTreeテーブルエンジンの使用例を示します。

  • マテリアライズドビューと組み合わせたAggregatingMergeTreeテーブルエンジンの使用

    1. visitsという名前の詳細テーブルを作成します。

      CREATE TABLE visits
      (
          UserID UInt64,
          CounterID UInt8,
          StartDate Date,
          Sign Int8
      )
      ENGINE = CollapsingMergeTree(Sign)
      ORDER BY UserID;

      による注文

    2. visits_agg_viewという名前のマテリアライズドビューを訪問テーブルに作成し、sumStateおよびuniqState関数を実行して訪問テーブルを事前に集計します。

      CREATE MATERIALIZED VIEW visits_agg_view
      ENGINE = AggregatingMergeTree() PARTITION BY toYYYYMM(StartDate) ORDER BY (CounterID, StartDate)
      AS SELECT
          CounterID,
          StartDate,
          sumState(Sign)    AS Visits,
          uniqState(UserID) AS Users
      FROM visits
      GROUP BY CounterID, StartDate;
    3. 訪問数テーブルにデータを書き込みます。

      INSERT INTO visits VALUES(0, 0, '2019-11-11', 1);
      INSERT INTO visits VALUES(1, 1, '2019-11-12', 1);
    4. sumMergeおよびuniqMerge集計関数を実行して、マテリアライズドビューを集計します。 次に、集計データを照会します。

      SELECT
          StartDate,
          sumMerge(Visits) AS Visits,
          uniqMerge(Users) AS Users
      FROM visits_agg_view
      GROUP BY StartDate
      ORDER BY StartDate
      説明

      sumおよびuniq関数はもはや使用できません。 上記の関数を使用すると、SQLステートメントを実行するときに次のエラーメッセージが返されます。Illegal type AggregateFunction(sum, Int8) of argument for aggregate function sum...

      次のクエリ結果が返されます。

      ┌──StartDate──┬─Visits─┬─Users──┐
      │  2019-11-11 │   1    │   1    │
      │  2019-11-12 │   1    │   1    │
      └─────────────┴────────┴────────┘
  • AggregatingMergeTreeテーブルエンジンを特別なデータ型AggregateFunctionと組み合わせて使用する

    1. detail_tableという名前の詳細テーブルを作成します。

      CREATE TABLE detail_table
      (   CounterID UInt8,
          StartDate Date,
          UserID UInt64
      ) ENGINE = MergeTree() 
      PARTITION BY toYYYYMM(StartDate) 
      ORDER BY (CounterID, StartDate);
    2. detail_tableにデータを書き込みます。

      INSERT INTO detail_table VALUES(0, '2019-11-11', 1);
      INSERT INTO detail_table VALUES(1, '2019-11-12', 1);
    3. UserID列のデータ型がAggregateFunctionであるagg_tableという名前の集計テーブルを作成します。

      CREATE TABLE agg_table
      (   CounterID UInt8,
          StartDate Date,
          UserID AggregateFunction(uniq, UInt64)
      ) ENGINE = AggregatingMergeTree() 
      PARTITION BY toYYYYMM(StartDate) 
      ORDER BY (CounterID, StartDate);
    4. uniqState集計関数を実行して、詳細テーブルのデータを集計テーブルに挿入します。

      INSERT INTO agg_table
      select CounterID, StartDate, uniqState(UserID)
      from detail_table
      group by CounterID, StartDate;
      説明

      INSERT INTO agg_table VALUES(1, '2019-11-12 ', 1); 文を実行して、集計テーブルにデータを挿入することはできません。 UInt64をAggregateFunction(uniq, UInt64) に変換できません。

    5. uniqMerge集計関数を実行して、集計テーブルのデータを集計します。 次に、集計データを照会します。

      SELECT uniqMerge(UserID) AS state 
      FROM agg_table 
      GROUP BY CounterID, StartDate;

      次のクエリ結果が返されます。

      ┌─state─┐
      │   1   │
      │   1   │
      └───────┘