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. | 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. | |
Mesin tabel ini mereplikasi data dari satu node ke node lain dan memastikan konsistensi data. | |||
Mesin tabel ini memungkinkan Anda menyesuaikan partisi data dan menentukan kunci partisi berdasarkan kebutuhan bisnis Anda untuk mendistribusikan data ke partisi yang berbeda. | |||
Mesin tabel ini menghapus duplikat yang memiliki kunci utama yang sama. Mesin tabel MergeTree tidak mendukung fitur ini. | |||
Mesin tabel ini memungkinkan Anda menambahkan kolom
| |||
Mesin tabel ini memungkinkan Anda menambahkan kolom | |||
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. | |||
Mesin tabel ini adalah mesin pra-agregasi dan digunakan untuk meningkatkan kinerja agregasi. Anda dapat menggunakan berbagai fungsi agregat. | |||
Mesin tabel ini digunakan untuk menyimpan dan merangkum data Graphite. Ini membantu mengurangi ruang penyimpanan dan meningkatkan efisiensi kueri data Graphite. | |||
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. | |||
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:
| 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. | |
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. | |||
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 | ||
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 | ||
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. |
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.
Untuk informasi lebih lanjut tentang mesin tabel MergeTree, lihat MergeTree.
Contoh berikut menunjukkan cara menggunakan mesin tabel MergeTree:
Buat tabel bernama test_tbl. Kunci utamanya adalah (
id,create_time). Data yang disimpan diurutkan berdasarkan kunci utama dan dipartisi berdasarkan nilaicreate_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;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);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 │ └────┴─────────────┴──────────┘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;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.
Untuk informasi lebih lanjut tentang mesin tabel ReplacingMergeTree, lihat ReplacingMergeTree.
Contoh berikut menunjukkan cara menggunakan mesin tabel ReplacingMergeTree:
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;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);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 │ └────┴─────────────┴──────────┘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;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.
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()dansum(col), redundansi data mungkin ada. Untuk mendapatkan hasil valid, modifikasi pernyataan SQL di lapisan bisnis. Ubahcount()menjadisum(Sign)dansum(col)menjadisum(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.
Untuk informasi lebih lanjut tentang mesin tabel CollapsingMergeTree, lihat CollapsingMergeTree.
Contoh berikut menunjukkan cara menggunakan mesin tabel CollapsingMergeTree:
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;Sisipkan baris status dengan nilai kolom Sign
1.INSERT INTO test_tbl_collapsing VALUES (4324182021466249494, 5, 146, 1);CatatanJika 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.
Sisipkan baris pembatalan dengan nilai kolom Sign
-1. Nilai dalam baris pembatalan sama dengan nilai dalam baris status yang disisipkan, kecuali nilai kolomSign. 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);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 │ └─────────────────────┴───────────┴──────────┴───────┘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 │ └─────────────────────┴───────────┴───────────┘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;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).
Untuk informasi lebih lanjut tentang mesin tabel VersionedCollapsingMergeTree, lihat VersionedCollapsingMergeTree.
Contoh berikut menunjukkan cara menggunakan mesin tabel VersionedCollapsingMergeTree:
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;Sisipkan baris pembatalan dengan nilai kolom Sign
-1.INSERT INTO test_tbl_Versioned VALUES (4324182021466249494, 5, 146, -1, 1);Sisipkan baris status dengan nilai kolom Sign
1dan nilai kolom Version1. 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);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 │ └─────────────────────┴───────────┴──────────┴────────┴────────┘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 │ └─────────────────────┴───────────┴──────────┘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;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 BYtetap 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.
Untuk informasi lebih lanjut tentang mesin tabel SummingMergeTree, lihat SummingMergeTree.
Contoh berikut menunjukkan cara menggunakan mesin tabel SummingMergeTree:
Buat tabel bernama test_tbl_summing.
CREATE TABLE test_tbl_summing ( key UInt32, value UInt32 ) ENGINE = SummingMergeTree() ORDER BY key;Tulis data.
INSERT INTO test_tbl_summing Values(1,1),(1,2),(2,1);Kueri data.
select * from test_tbl_summing;Hasil kueri berikut dikembalikan:
┌─key─┬value─┐ │ 1 │ 1 │ │ 1 │ 2 │ │ 2 │ 1 │ └─────┴──────┘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;Setelah kompaksi dipaksa di latar belakang, eksekusi pernyataan yang berisi klausa
GROUP BYuntuk 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.
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
Buat tabel detail bernama visits.
CREATE TABLE visits ( UserID UInt64, CounterID UInt8, StartDate Date, Sign Int8 ) ENGINE = CollapsingMergeTree(Sign) ORDER BY UserID;Buat tampilan materialisasi bernama visits_agg_view untuk tabel visits, dan eksekusi fungsi
sumStatedanuniqStateuntuk 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;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);Eksekusi fungsi agregat
sumMergedanuniqMergeuntuk 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 StartDateCatatanFungsi
sumdanuniqtidak 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
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);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);Buat tabel agregat bernama agg_table di mana tipe data kolom
UserIDadalah AggregateFunction.CREATE TABLE agg_table ( CounterID UInt8, StartDate Date, UserID AggregateFunction(uniq, UInt64) ) ENGINE = AggregatingMergeTree() PARTITION BY toYYYYMM(StartDate) ORDER BY (CounterID, StartDate);Eksekusi fungsi agregat
uniqStateuntuk menyisipkan data dari tabel detail ke tabel agregat.INSERT INTO agg_table select CounterID, StartDate, uniqState(UserID) from detail_table group by CounterID, StartDate;CatatanAnda 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)...Eksekusi fungsi agregat
uniqMergeuntuk 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 │ └───────┘