全部产品
Search
文档中心

ApsaraDB for ClickHouse:Mesin tabel

更新时间:Jun 29, 2025

ApsaraDB for ClickHouse mendukung empat keluarga mesin tabel: MergeTree, Log, Integrations, dan Special. Topik ini menjelaskan mesin tabel dari keempat keluarga tersebut serta memberikan contoh penggunaan fitur umum dari mesin tabel.

Ikhtisar

Mesin tabel mengacu pada jenis tabel. Di ApsaraDB for ClickHouse, mesin tabel menentukan cara penyimpanan dan pembacaan data, dukungan indeks, serta dukungan replikasi utama/sekunder. Tabel berikut menjelaskan mesin tabel yang didukung oleh ApsaraDB for ClickHouse.

Keluarga

Deskripsi

Mesin tabel

Fitur

MergeTree

Mesin dalam keluarga MergeTree cocok untuk tugas dengan beban tinggi. Mesin serbaguna yang kuat ini memungkinkan Anda menyisipkan sejumlah besar data dengan kecepatan tinggi dan mendukung pemrosesan data selanjutnya.

Mesin dalam keluarga ini mendukung fitur seperti replikasi data, partisi, dan pengambilan sampel data.

MergeTree

Mesin tabel ini menyisipkan sejumlah besar data ke dalam tabel. Data dimasukkan ke dalam tabel secara cepat bagian demi bagian. Kemudian, bagian-bagian tersebut digabungkan berdasarkan aturan.

Replikasi Data

Mesin tabel ini mereplikasi data dari satu node ke node lain dan memastikan konsistensi data.

Kunci Partisi Kustom

Mesin tabel ini memungkinkan Anda menyesuaikan partisi data dan menentukan kunci partisi berdasarkan kebutuhan bisnis Anda untuk mendistribusikan data ke partisi yang berbeda.

ReplacingMergeTree

Mesin tabel ini menghapus duplikat yang memiliki kunci utama yang sama. Mesin tabel MergeTree tidak mendukung fitur ini.

CollapsingMergeTree

Mesin tabel ini memungkinkan Anda menambahkan kolom Sign ke pernyataan CREATE TABLE. Ini menghilangkan batasan berikut dari mesin tabel ReplacingMergeTree:

  • Dalam skenario terdistribusi, data yang memiliki kunci utama yang sama mungkin didistribusikan ke node yang berbeda. Duplikat tidak dapat dihapus untuk data lintas shard yang berbeda.

  • Sebelum eksekusi pernyataan OPTIMIZE selesai, duplikat yang memiliki kunci utama yang sama mungkin tidak dihapus. Misalnya, duplikat dihapus untuk beberapa data, tetapi duplikat yang memiliki kunci utama yang sama tidak dihapus untuk data lainnya.

  • Pernyataan OPTIMIZE dieksekusi di latar belakang, dan waktu eksekusinya tidak dapat diprediksi.

  • Dalam skenario di mana volume data yang besar ada, diperlukan waktu yang lama untuk mengeksekusi pernyataan OPTIMIZE secara manual. Dalam hal ini, persyaratan untuk kueri real-time tidak dapat dipenuhi.

VersionedCollapsingMergeTree

Mesin tabel ini memungkinkan Anda menambahkan kolom Version ke pernyataan CREATE TABLE. Ini membantu menyelesaikan masalah bahwa mesin tabel CollapsingMergeTree tidak dapat runtuh atau menghapus baris seperti yang diharapkan jika baris dimasukkan dalam urutan yang salah.

SummingMergeTree

Mesin tabel ini melakukan agregasi awal pada kolom kunci utama dan menggabungkan semua baris yang memiliki kunci utama yang sama menjadi satu baris. Ini membantu mengurangi penggunaan penyimpanan dan meningkatkan kinerja agregasi.

AggregatingMergeTree

Mesin tabel ini adalah mesin pra-agregasi dan digunakan untuk meningkatkan kinerja agregasi. Anda dapat menggunakan berbagai fungsi agregat.

GraphiteMergeTree

Mesin tabel ini digunakan untuk menyimpan dan merangkum data Graphite. Ini membantu mengurangi ruang penyimpanan dan meningkatkan efisiensi kueri data Graphite.

Indeks Pencarian Tetangga Terdekat Perkiraan

Mesin data ini adalah mesin indeks untuk pencarian tetangga terdekat perkiraan dan secara efisien mencari titik data terdekat dengan titik kueri tertentu dalam kumpulan data berskala besar.

Pencarian Teks Lengkap menggunakan Indeks Terbalik

Mesin data ini menggunakan indeks terbalik untuk pencarian teks lengkap, dan digunakan untuk pencarian dan pengambilan teks lengkap dalam data teks berskala besar.

Log

Mesin dalam keluarga Log cocok untuk skenario di mana Anda perlu menulis data dengan cepat ke tabel kecil yang berisi sekitar satu juta baris dan membaca semua data.

Berikut ini menjelaskan fitur umum dari mesin dalam keluarga ini:

  • Data ditambahkan dan ditulis ke disk.

  • Operasi DELETE dan UPDATE tidak didukung.

  • Indeks tidak didukung.

  • Data tidak dapat ditulis secara atomik.

  • Operasi INSERT memblokir operasi SELECT.

TinyLog

Mesin tabel ini tidak mendukung pembacaan bersamaan untuk file data dan memberikan kinerja kueri yang buruk. Mesin tabel ini menggunakan format sederhana dan cocok untuk penyimpanan sementara data antara.

StripeLog

Mesin tabel ini mendukung pembacaan bersamaan untuk file data dan memberikan kinerja kueri yang lebih tinggi daripada TinyLog. Semua kolom disimpan dalam satu file besar untuk mengurangi jumlah file.

Log

Mesin tabel ini mendukung pembacaan bersamaan untuk file data dan memberikan kinerja kueri yang lebih tinggi daripada TinyLog. Setiap kolom disimpan dalam file terpisah.

Integrasi

Mesin dalam keluarga Integrasi cocok untuk mengimpor data eksternal ke ApsaraDB for ClickHouse atau menggunakan sumber data eksternal di ApsaraDB for ClickHouse.

Kafka

Mesin tabel ini mengimpor data dari topik Kafka ke ApsaraDB for ClickHouse.

MySQL

Mesin tabel ini menggunakan MySQL sebagai mesin penyimpanan dan melakukan operasi seperti SELECT pada tabel MySQL di ApsaraDB for ClickHouse.

JDBC

Mesin tabel ini membaca sumber data menggunakan string koneksi Java Database Connectivity (JDBC).

ODBC

Mesin tabel ini membaca sumber data menggunakan string koneksi Open Database Connectivity (ODBC).

HDFS

Mesin tabel ini membaca file data dalam format tertentu pada Hadoop Distributed File System (HDFS).

Spesial

Mesin dalam keluarga Spesial cocok untuk skenario tertentu.

Distributed

Mesin tabel ini tidak menyimpan data, tetapi mendukung kueri terdistribusi di beberapa server.

MaterializedView

Mesin tabel ini digunakan untuk membuat tampilan materialisasi.

Dictionary

Mesin tabel ini menampilkan data kamus sebagai tabel ApsaraDB for ClickHouse.

Merge

Mesin tabel ini tidak menyimpan data, tetapi dapat membaca data dari tabel lain secara bersamaan.

File

Mesin tabel ini menggunakan file lokal sebagai penyimpanan data.

NULL

Mesin tabel ini membuang data yang ditulis ke tabel Null. Jika data dibaca dari tabel Null, responsnya kosong.

Set

Mesin tabel ini selalu menyimpan data di memori akses acak (RAM).

Join

Mesin tabel ini selalu menyimpan data di RAM.

URL

Mesin tabel ini mengelola data pada server HTTP dan HTTPS jarak jauh.

View

Mesin tabel ini tidak menyimpan data. Mesin tabel ini hanya menyimpan pernyataan SELECT yang ditentukan.

Memory

Mesin tabel ini menyimpan data di RAM. Data hilang setelah server di-restart. Mesin tabel ini memberikan kinerja kueri yang sangat baik. Mesin tabel ini cocok untuk kueri tabel kecil yang berisi kurang dari 100 juta baris dan tidak memiliki persyaratan persistensi data. Di ApsaraDB for ClickHouse, mesin tabel ini digunakan untuk kueri tabel sementara dalam banyak kasus.

Buffer

Mesin tabel ini digunakan untuk mengonfigurasi buffer memori untuk tabel tujuan. Jika buffer memenuhi kondisi yang ditentukan, data akan di-flush ke disk.

Catatan

Untuk informasi lebih lanjut tentang mesin tabel, lihat Mesin Tabel.

MergeTree

Mesin tabel MergeTree digunakan untuk menganalisis sejumlah besar data. Mesin ini mendukung partisi data, pengurutan data yang disimpan, indeks kunci utama, indeks jarang, serta waktu hidup (TTL) untuk data. Mesin tabel MergeTree mendukung semua sintaks SQL dari ApsaraDB for ClickHouse, tetapi beberapa fiturnya berbeda dari standar SQL.

Dalam contoh ini, kunci utama digunakan untuk menunjukkan perbedaan fitur. Dalam sintaks SQL dari ApsaraDB for ClickHouse, kunci utama digunakan untuk menghapus duplikat guna memastikan data unik. Pada mesin tabel MergeTree, kunci utama digunakan untuk mempercepat kueri. Bahkan setelah kompaksi selesai, baris data dengan kunci utama yang sama masih ada.

Catatan

Untuk informasi lebih lanjut tentang mesin tabel MergeTree, lihat MergeTree.

Contoh berikut menunjukkan cara menggunakan mesin tabel MergeTree:

  1. Buat tabel bernama test_tbl. Kunci utamanya adalah (id, create_time). Data yang disimpan diurutkan berdasarkan kunci utama dan dipartisi berdasarkan nilai 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. Tulis data yang memiliki kunci utama duplikat.

    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. Kueri data.

    select * from test_tbl;

    Hasil kueri berikut dikembalikan:

    ┌─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. Eksekusi pernyataan OPTIMIZE untuk memaksa kompaksi di latar belakang. Kompaksi dipaksa karena mesin tabel dalam keluarga MergeTree menggunakan struktur mirip log-structured merge-tree (LSM-tree), dan logika pemrosesan di lapisan penyimpanan tidak diimplementasikan hingga fase kompaksi dimulai.

    optimize table test_tbl final;
  5. Kueri data lagi.

    select * from test_tbl;

    Hasil kueri berikut dikembalikan. Data dengan kunci utama duplikat masih ada.

    ┌─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 menyediakan mesin tabel ReplacingMergeTree untuk menghapus duplikat dengan kunci utama yang sama. Ini membantu menyelesaikan masalah bahwa mesin tabel MergeTree tidak mendukung fitur ini.

Meskipun mesin tabel ReplacingMergeTree dapat menghapus duplikat dengan kunci utama yang sama, mesin ini memiliki batasan berikut. Oleh karena itu, mesin ini digunakan untuk memastikan bahwa duplikat akhirnya dihapus, tetapi tidak dapat menjamin kunci utama unik selama proses kueri.

  • Dalam skenario terdistribusi, data dengan kunci utama yang sama mungkin didistribusikan ke node berbeda. Duplikat tidak dapat dihapus untuk data lintas shard yang berbeda.

  • Sebelum eksekusi pernyataan OPTIMIZE selesai, duplikat dengan kunci utama yang sama mungkin belum dihapus. Misalnya, duplikat dihapus untuk beberapa data, tetapi tidak untuk data lainnya.

  • Pernyataan OPTIMIZE dieksekusi di latar belakang, dan waktu eksekusinya tidak dapat diprediksi.

  • Dalam skenario dengan volume data besar, diperlukan waktu lama untuk mengeksekusi pernyataan OPTIMIZE secara manual. Dalam hal ini, persyaratan untuk kueri real-time tidak dapat dipenuhi.

Catatan

Untuk informasi lebih lanjut tentang mesin tabel ReplacingMergeTree, lihat ReplacingMergeTree.

Contoh berikut menunjukkan cara menggunakan mesin tabel ReplacingMergeTree:

  1. Buat tabel bernama 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. Tulis data yang memiliki kunci utama duplikat.

    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. Kueri data.

    select * from test_tbl_replacing;

    Hasil kueri berikut dikembalikan:

    ┌─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. Eksekusi pernyataan OPTIMIZE untuk memaksa kompaksi di latar belakang. Kompaksi dipaksa karena mesin tabel dalam keluarga MergeTree menggunakan struktur mirip LSM tree dan logika pemrosesan di lapisan penyimpanan tidak diimplementasikan hingga fase kompaksi dimulai.

    optimize table test_tbl_replacing final;
  5. Kueri data lagi.

    select * from test_tbl_replacing;

    Hasil kueri berikut dikembalikan. Data dengan kunci utama duplikat telah dihapus.

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

CollapsingMergeTree

Mesin tabel CollapsingMergeTree menghilangkan batasan pada fitur mesin tabel ReplacingMergeTree. Saat menggunakan mesin tabel CollapsingMergeTree, Anda harus menentukan kolom Sign dalam pernyataan CREATE TABLE. Baris dibagi menjadi dua kategori berdasarkan nilai kolom Sign: baris status dan baris pembatalan. Baris dengan nilai kolom Sign 1 disebut baris status, digunakan untuk menambahkan status. Baris dengan nilai kolom Sign -1 disebut baris pembatalan, digunakan untuk menghapus status.

Catatan

Mesin tabel CollapsingMergeTree dapat menghapus baris dengan kunci utama yang sama secara real-time. Namun, jika status terus berubah dan baris ditulis secara paralel menggunakan beberapa thread, baris status dan baris pembatalan mungkin tidak berurutan sehingga tidak dapat diruntuhkan atau dihapus seperti yang diharapkan.

Selama kompaksi di latar belakang, baris dengan kunci utama yang sama dan nilai Sign berlawanan diruntuhkan atau dihapus. Jika tidak ada kompaksi yang dilakukan, baris status dan baris pembatalan ada bersamaan. Untuk meruntuhkan atau menghapus baris dengan kunci utama yang sama, lakukan operasi berikut di lapisan bisnis:

  • Catat nilai baris status asli, atau kueri database untuk mendapatkan nilai baris status asli sebelum menghapus status.

    Alasannya adalah Anda harus menulis baris pembatalan saat menghapus status. Baris pembatalan harus berisi data dengan kunci utama yang sama dengan baris status asli, kecuali kolom Sign.

  • Saat mengeksekusi fungsi agregat seperti count() dan sum(col), redundansi data mungkin ada. Untuk mendapatkan hasil valid, modifikasi pernyataan SQL di lapisan bisnis. Ubah count() menjadi sum(Sign) dan sum(col) menjadi sum(col * Sign).

    Alasan berikut tersedia:

    • Waktu untuk melakukan kompaksi di latar belakang tidak dapat diprediksi. Saat memulai kueri, baris status dan baris pembatalan mungkin belum runtuh atau dihapus.

    • ApsaraDB for ClickHouse tidak dapat memastikan bahwa baris dengan kunci utama yang sama jatuh pada node yang sama. Data tidak dapat diruntuhkan atau dihapus lintas node.

Catatan

Untuk informasi lebih lanjut tentang mesin tabel CollapsingMergeTree, lihat CollapsingMergeTree.

Contoh berikut menunjukkan cara menggunakan mesin tabel CollapsingMergeTree:

  1. Buat tabel bernama test_tbl_collapsing.

    CREATE TABLE test_tbl_collapsing
    (
        UserID UInt64,
        PageViews UInt8,
        Duration UInt8,
        Sign Int8
    )
    ENGINE = CollapsingMergeTree(Sign)
    ORDER BY UserID;
  2. Sisipkan baris status dengan nilai kolom Sign 1.

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

    Jika Anda menyisipkan baris pembatalan dan kemudian baris status, baris pembatalan dan baris status mungkin tidak berurutan. Dalam hal ini, bahkan jika kompaksi dipaksa dilakukan di latar belakang, data dengan kunci utama yang sama tidak dapat diruntuhkan atau dihapus.

  3. Sisipkan baris pembatalan dengan nilai kolom Sign -1. Nilai dalam baris pembatalan sama dengan nilai dalam baris status yang disisipkan, kecuali nilai kolom Sign. Pada saat yang sama, sisipkan baris status baru dengan kunci utama yang sama dengan baris pembatalan.

    INSERT INTO test_tbl_collapsing VALUES (4324182021466249494, 5, 146, -1), (4324182021466249494, 6, 185, 1);
  4. Kueri data.

    SELECT * FROM test_tbl_collapsing;

    Hasil kueri berikut dikembalikan:

    ┌────────UserID───────┬─PageViews─┬─Duration─┬─Sign──┐ 
    │ 4324182021466249494 │    5      │    146   │   1   │ 
    │ 4324182021466249494 │    5      │    146   │  -1   │ 
    │ 4324182021466249494 │    6      │    185   │   1   │ 
    └─────────────────────┴───────────┴──────────┴───────┘
  5. Jika ingin mengeksekusi fungsi agregat pada kolom tertentu, modifikasi pernyataan SQL untuk mendapatkan hasil valid. Dalam contoh ini, fungsi agregat sum(col) digunakan dan pernyataan SQL dimodifikasi menjadi pernyataan berikut:

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

    Setelah data di-aggregasi, hasil kueri berikut dikembalikan:

    ┌────────UserID───────┬─PageViews─┬─Duration──┐ 
    │ 4324182021466249494 │    6      │    185    │ 
    └─────────────────────┴───────────┴───────────┘
  6. Eksekusi pernyataan OPTIMIZE untuk memaksa kompaksi di latar belakang. Kompaksi dipaksa karena mesin tabel dalam keluarga MergeTree menggunakan struktur mirip LSM tree dan logika pemrosesan di lapisan penyimpanan tidak diimplementasikan hingga fase kompaksi dimulai.

    optimize table test_tbl_collapsing final;
  7. Kueri data lagi.

    SELECT * FROM test_tbl_collapsing;

    Hasil kueri berikut dikembalikan:

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

VersionedCollapsingMergeTree

Mesin tabel CollapsingMergeTree tidak dapat meruntuhkan atau menghapus baris seperti yang diharapkan jika baris dimasukkan dalam urutan yang salah. Untuk menyelesaikan masalah ini, ApsaraDB for ClickHouse menyediakan mesin tabel VersionedCollapsingMergeTree yang memungkinkan Anda menambahkan kolom Version ke pernyataan CREATE TABLE. Kolom Version digunakan untuk mencatat pemetaan antara baris status dan baris pembatalan jika baris dimasukkan dalam urutan yang salah. Selama kompaksi di latar belakang, baris dengan kunci utama yang sama, nilai Version yang sama, dan nilai Sign berlawanan diruntuhkan atau dihapus.

Mirip dengan mesin tabel CollapsingMergeTree, saat mengeksekusi fungsi agregat seperti count() dan sum(col), modifikasi pernyataan SQL di lapisan bisnis. Ubah count() menjadi sum(Sign) dan sum(col) menjadi sum(col * Sign).

Catatan

Untuk informasi lebih lanjut tentang mesin tabel VersionedCollapsingMergeTree, lihat VersionedCollapsingMergeTree.

Contoh berikut menunjukkan cara menggunakan mesin tabel VersionedCollapsingMergeTree:

  1. Buat tabel bernama 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. Sisipkan baris pembatalan dengan nilai kolom Sign -1.

    INSERT INTO test_tbl_Versioned VALUES (4324182021466249494, 5, 146, -1, 1);
  3. Sisipkan baris status dengan nilai kolom Sign 1 dan nilai kolom Version 1. Nilai di kolom lainnya sama dengan nilai dalam baris pembatalan yang disisipkan. Pada saat yang sama, sisipkan baris status baru dengan kunci utama yang sama dengan baris pembatalan.

    INSERT INTO test_tbl_Versioned VALUES (4324182021466249494, 5, 146, 1, 1),(4324182021466249494, 6, 185, 1, 2);
  4. Kueri data.

    SELECT * FROM test_tbl_Versioned;

    Hasil kueri berikut dikembalikan:

    ┌────────UserID───────┬─PageViews─┬─Duration─┬─Sign───┬Version─┐ 
    │ 4324182021466249494 │    5      │    146   │  -1    │    1   │
    │ 4324182021466249494 │    5      │    146   │   1    │    1   │
    │ 4324182021466249494 │    6      │    185   │   1    │    2   │
    └─────────────────────┴───────────┴──────────┴────────┴────────┘
  5. Jika ingin mengeksekusi fungsi agregat pada kolom tertentu, modifikasi pernyataan SQL untuk mendapatkan hasil valid. Dalam contoh ini, fungsi agregat sum(col) digunakan dan pernyataan SQL dimodifikasi menjadi pernyataan berikut:

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

    Setelah data di-aggregasi, hasil kueri berikut dikembalikan:

    ┌────────UserID───────┬─PageViews─┬─Duration─┐ 
    │ 4324182021466249494 │    6      │    185   │
    └─────────────────────┴───────────┴──────────┘
  6. Eksekusi pernyataan OPTIMIZE untuk memaksa kompaksi di latar belakang. Kompaksi dipaksa karena mesin tabel dalam keluarga MergeTree menggunakan struktur mirip LSM tree dan logika pemrosesan di lapisan penyimpanan tidak diimplementasikan hingga fase kompaksi dimulai.

    optimize table test_tbl_Versioned final;
  7. Jalankan kueri data kembali.

    SELECT * FROM test_tbl_Versioned;

    Hasil kueri berikut dikembalikan:

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

SummingMergeTree

Mesin tabel SummingMergeTree melakukan pra-agregasi pada kolom kunci utama dan menggabungkan semua baris dengan kunci utama yang sama menjadi satu baris. Hal ini membantu mengurangi penggunaan penyimpanan serta meningkatkan kinerja agregasi.

Sebelum menggunakan mesin tabel SummingMergeTree, perhatikan hal-hal berikut:

  • Di ApsaraDB for ClickHouse, kolom kunci utama hanya di-aggregasi saat kompaksi dilakukan di latar belakang. Waktu kompaksi tidak dapat diprediksi, sehingga beberapa data mungkin sudah di-aggregasi, sementara yang lain belum. Oleh karena itu, klausa GROUP BY tetap diperlukan dalam pernyataan SQL untuk menjamin agregasi.

  • Selama pra-agregasi, ApsaraDB for ClickHouse melakukan pra-agregasi pada semua kolom kecuali kolom kunci utama. Jika kolom-kolom tersebut dapat di-aggregasi, seperti tipe data NUMERIC, nilainya akan dijumlahkan. Namun, jika kolom-kolom tersebut tidak dapat di-aggregasi, seperti tipe data STRING, nilai acak akan digunakan.

  • Kami merekomendasikan penggunaan mesin tabel SummingMergeTree bersamaan dengan mesin tabel MergeTree. Mesin tabel MergeTree menyimpan data lengkap, sedangkan mesin tabel SummingMergeTree menyimpan hasil pra-agregasi.

Catatan

Untuk informasi lebih lanjut tentang mesin tabel SummingMergeTree, lihat SummingMergeTree.

Contoh berikut menunjukkan cara menggunakan mesin tabel SummingMergeTree:

  1. Buat tabel bernama test_tbl_summing.

    CREATE TABLE test_tbl_summing
    (
        key UInt32,
        value UInt32
    )
    ENGINE = SummingMergeTree()
    ORDER BY key;
  2. Tulis data.

    INSERT INTO test_tbl_summing Values(1,1),(1,2),(2,1);
  3. Kueri data.

    select * from test_tbl_summing;

    Hasil kueri berikut dikembalikan:

    ┌─key─┬value─┐
    │  1  │  1   │
    │  1  │  2   │
    │  2  │  1   │
    └─────┴──────┘    
  4. Eksekusi pernyataan OPTIMIZE untuk memaksa kompaksi di latar belakang. Kompaksi dipaksa karena mesin tabel dalam keluarga MergeTree menggunakan struktur mirip LSM tree, dan logika pemrosesan di lapisan penyimpanan tidak diimplementasikan hingga fase kompaksi dimulai.

    optimize table test_tbl_summing final;
  5. Setelah kompaksi dipaksa di latar belakang, eksekusi pernyataan yang berisi klausa GROUP BY untuk mengagregasi data. Kemudian, kueri data lagi.

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

    Hasil kueri berikut dikembalikan. Data dengan kunci utama duplikat telah di-aggregasi.

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

AggregatingMergeTree

Mesin tabel AggregatingMergeTree adalah mesin pra-agregasi yang dirancang untuk meningkatkan kinerja agregasi. Mesin tabel SummingMergeTree menggunakan fungsi sum untuk mengagregasi kolom non-kunci utama. Dibandingkan dengan SummingMergeTree, AggregatingMergeTree memungkinkan penggunaan berbagai fungsi agregat.

Sintaksis mesin tabel AggregatingMergeTree cukup kompleks. Mesin ini harus digunakan bersamaan dengan tampilan materialisasi atau tipe data khusus AggregateFunction di ApsaraDB for ClickHouse.

Catatan

Untuk informasi lebih lanjut tentang mesin tabel AggregatingMergeTree, lihat AggregatingMergeTree.

Contoh berikut menunjukkan cara menggunakan mesin tabel AggregatingMergeTree:

  • Gunakan mesin tabel AggregatingMergeTree bersamaan dengan tampilan materialisasi

    1. Buat tabel detail bernama visits.

      CREATE TABLE visits
      (
          UserID UInt64,
          CounterID UInt8,
          StartDate Date,
          Sign Int8
      )
      ENGINE = CollapsingMergeTree(Sign)
      ORDER BY UserID;
    2. Buat tampilan materialisasi bernama visits_agg_view untuk tabel visits, dan eksekusi fungsi sumState dan uniqState untuk pra-agregasi tabel visits.

      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. Tulis data ke tabel visits.

      INSERT INTO visits VALUES(0, 0, '2019-11-11', 1);
      INSERT INTO visits VALUES(1, 1, '2019-11-12', 1);
    4. Eksekusi fungsi agregat sumMerge dan uniqMerge untuk mengagregasi tampilan materialisasi. Kemudian, kueri data yang telah di-aggregasi.

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

      Fungsi sum dan uniq tidak dapat digunakan lagi. Jika Anda menggunakan fungsi-fungsi tersebut, pesan kesalahan berikut akan dikembalikan saat mengeksekusi pernyataan SQL: Illegal type AggregateFunction(sum, Int8) of argument for aggregate function sum...

      Hasil kueri berikut dikembalikan:

      ┌──StartDate──┬─Visits─┬─Users──┐
      │  2019-11-11 │   1    │   1    │
      │  2019-11-12 │   1    │   1    │
      └─────────────┴────────┴────────┘
  • Gunakan mesin tabel AggregatingMergeTree bersamaan dengan tipe data khusus AggregateFunction

    1. Buat tabel detail bernama detail_table.

      CREATE TABLE detail_table
      (   CounterID UInt8,
          StartDate Date,
          UserID UInt64
      ) ENGINE = MergeTree() 
      PARTITION BY toYYYYMM(StartDate) 
      ORDER BY (CounterID, StartDate);
    2. Tulis data ke detail_table.

      INSERT INTO detail_table VALUES(0, '2019-11-11', 1);
      INSERT INTO detail_table VALUES(1, '2019-11-12', 1);
    3. Buat tabel agregat bernama agg_table di mana tipe data kolom UserID adalah AggregateFunction.

      CREATE TABLE agg_table
      (   CounterID UInt8,
          StartDate Date,
          UserID AggregateFunction(uniq, UInt64)
      ) ENGINE = AggregatingMergeTree() 
      PARTITION BY toYYYYMM(StartDate) 
      ORDER BY (CounterID, StartDate);
    4. Eksekusi fungsi agregat uniqState untuk menyisipkan data dari tabel detail ke tabel agregat.

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

      Anda tidak dapat mengeksekusi pernyataan INSERT INTO agg_table VALUES(1, '2019-11-12', 1); untuk menyisipkan data ke tabel agregat. Jika tidak, pesan kesalahan berikut akan dikembalikan: Cannot convert UInt64 to AggregateFunction(uniq, UInt64)...

    5. Eksekusi fungsi agregat uniqMerge untuk mengagregasi data dalam tabel agregat. Kemudian, kueri data yang telah di-aggregasi.

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

      Hasil kueri berikut dikembalikan:

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