Selama eksekusi kueri, fitur pruner pada indeks penyimpanan kolom menyaring blok data yang tidak perlu diakses, sehingga meningkatkan performa kueri SQL. Topik ini menjelaskan skenario penggunaan pruner, pertimbangan, sintaksis, dan parameter terkait.
Ikhtisar
Data indeks penyimpanan kolom disimpan dalam blok data berkolom tunggal dengan granularitas default 64.000 baris per blok. Jumlah blok data dapat diperkirakan menggunakan rumus: total baris tabel / 64000. Semua paket kolom untuk satu set baris membentuk grup baris. Pemindaian data memerlukan penelusuran semua blok data kolom tertentu untuk mengambil catatan yang memenuhi kondisi filter. Overhead pemindaian tinggi saat melakukan kueri pada tabel besar, terutama jika data tabel tidak muat sepenuhnya dalam memori. Dalam praktiknya, informasi statistik bersama kondisi filter tertentu dapat digunakan untuk melewati blok data yang tidak diperlukan dan mempercepat kueri. Dalam indeks penyimpanan kolom PolarDB, metode ini disebut pruner. Saat ini, empat jenis pruner didukung:
Bloom filter
Menggunakan larik bit untuk merepresentasikan himpunan dan menentukan apakah suatu elemen termasuk dalam himpunan tersebut.
Prefix bloom filter: Membangun bloom filter berdasarkan awalan string untuk mengurangi overhead performa dan penyimpanan akibat string panjang. Versi yang didukung adalah sebagai berikut:
MySQL 8.0.1, versi revisi 8.0.1.1.42 atau lebih baru.
MySQL 8.0.2, versi revisi 8.0.2.2.25 atau lebih baru.
Minmax indexes
Menyimpan nilai minimum dan maksimum untuk setiap blok data. Kondisi filter dibandingkan dengan nilai-nilai ini untuk menentukan apakah blok tersebut perlu dipindai.
Token bloom filter
Menyaring string dengan memisahkannya pada karakter non-alfanumerik. Misalnya, "I am IMCI" menjadi
I |am|IMCI. Ini cocok untuk kueri fuzzy LIKE.N-gram bloom filter
Menyaring string dengan membaginya menjadi substring dengan panjang tertentu. Misalnya, string "storage" dengan ukuran n-gram 3 menjadi
sto|tor|ora|rag|age. Ini cocok untuk kueri fuzzy LIKE.
Skenario
Bloom filter: Ideal untuk kondisi ekuivalen dan IN. Memberikan penyaringan kuat ketika kondisi ekuivalen memiliki selektivitas tinggi, misalnya saat menyaring berdasarkan ID string.
Minmax indexes: Efektif ketika data kolom memiliki lokalitas baik, terutama untuk filter rentang dan ekuivalen, seperti klausa WHERE dengan bidang tanggal atau bidang terurut.
Token bloom filters dan n-gram bloom filters secara cepat mengeliminasi blok data yang tidak sesuai dalam kueri fuzzy LIKE.
Overhead penyimpanan
Mengaktifkan pruner untuk kolom bertipe string menambah overhead penyimpanan dan memori. Anda dapat memilih jenis pruner—seperti bloom filter, minmax indexes, token bloom filter, atau n-gram bloom filter—berdasarkan skenario penggunaan. Rumus penggunaan memori adalah sebagai berikut:
Bloom filter, token bloom filter, atau n-gram bloom filter
Dengan ukuran blok default 64.000 baris dan jumlah nilai unik yang melebihi 3% dari total baris:
Penggunaan memori = 1,2 × jumlah kolom dengan bloom filter × total baris tabel (byte)
Dengan ukuran blok default 64.000 baris dan jumlah nilai unik yang kurang dari atau sama dengan 3% dari total baris:
Penggunaan memori = 1,2 × jumlah kolom dengan bloom filter × jumlah nilai unik (byte)
Dalam kasus ini, efektivitas bloom filter bergantung pada lokalitas data. Performa buruk jika data terdistribusi secara merata.
Minmax indexes
Rumus penggunaan memorinya adalah sebagai berikut:
Penggunaan memori = 2 × jumlah kolom dengan minmax indexes × (total baris tabel / ukuran blok) × panjang awalan × panjang pengkodean karakter
Sebagai contoh, tabel dengan 2 miliar baris, minmax indexes pada 10 kolom, panjang awalan 20, ukuran blok 64.000, dan pengkodean utf8mb4 (4 byte per karakter) menggunakan sekitar 46 MB memori.
Pertimbangan
Untuk kluster yang menjalankan PolarDB MySQL versi 8.0.1.1.32 atau lebih lama, atau 8.0.2.2.13 atau lebih lama, pruner tidak dibangun untuk blok data yang berisi nilai NULL. Penyaringan dengan
IS NULLatauIS NOT NULLtidak didukung.Untuk kluster yang menjalankan PolarDB MySQL versi 8.0.1.1.35 atau lebih baru, atau 8.0.2.2.16 atau lebih baru, pruner secara otomatis dibangun untuk kolom bertipe string saat Anda membuat indeks penyimpanan kolom. Bloom filter menggunakan cache Least Recently Used (LRU) untuk manajemen memori. Jika Anda melakukan upgrade dari versi lama, Anda harus membangun ulang indeks penyimpanan kolom untuk mengaktifkan pruner pada kolom string.
Untuk kluster yang menjalankan PolarDB MySQL versi 8.0.1.1.34 atau lebih lama, atau 8.0.2.2.15 atau lebih lama, pruner tetap berada di memori secara permanen. Pruner tidak secara otomatis dibangun untuk kolom string selama pembuatan indeks penyimpanan kolom.
Untuk membangun pruner pada kolom bertipe string, pastikan string tersebut tidak mengandung '\0', misalnya 'polar\0db'.
Sistem secara otomatis membangun minmax indexes untuk tipe numerik, seperti INT, DECIMAL, dan DATETIME.
Minmax indexes tidak didukung untuk bidang JSON atau GEOMETRY.
Bloom filter tidak didukung untuk tipe numerik seperti INT, DECIMAL, dan DATETIME, atau untuk bidang JSON, BLOB, dan TEXT.
Referensi sintaksis
Anda dapat membangun pruner saat membuat tabel atau menambahkan/menghapusnya dari tabel yang sudah ada. Untuk memodifikasi pruner pada tabel yang sudah ada, Anda harus terlebih dahulu menghapus indeks penyimpanan kolom lalu membuatnya kembali. Sintaksisnya adalah sebagai berikut:
Anda dapat menggunakan pernyataan Data Definition Language (DDL) untuk memodifikasi atribut COMMENT dalam skema tabel guna menambahkan atau menghapus pruner untuk kolom bertipe string.
Atribut COMMENT tingkat kolom memiliki prioritas lebih tinggi daripada atribut COMMENT tingkat tabel.
Versi yang lebih baru mendukung lebih banyak jenis pruner dan mengaktifkan jenis umum secara default, seperti minmax indexes dan bloom filter untuk string. Sebelum menambahkan pruner baru, periksa jenis pruner yang sudah ada pada setiap kolom. Untuk informasi selengkapnya, lihat Periksa Apakah Pruner Telah Dibangun pada Kolom Tabel.
Bangun pruner saat membuat tabel
Membuat pemangkas (bloom filter)
CatatanKluster yang menjalankan PolarDB MySQL 8.0 dengan revisi 8.0.1.1.32 atau lebih baru, atau 8.0.2.2.13 atau lebih baru, mendukung atribut
PRUNER_BLOOM.Bangun bloom filter untuk semua kolom yang didukung. Contoh:
CREATE TABLE t1 ( id INT PRIMARY KEY, str_col1 char(10), str_col2 varchar(10) ) ENGINE InnoDB COMMENT "COLUMNAR=1 PRUNER_BLOOM=1"; /* atribut pruner_bloom dalam komentar */Bangun bloom filter untuk kolom tertentu. Contoh:
CREATE TABLE t1 ( id INT PRIMARY KEY, str_col1 char(10) "PRUNER_BLOOM=1", /* atribut pruner_bloom dalam komentar */ str_col2 varchar(10) ) ENGINE InnoDB COMMENT "COLUMNAR=1";
Membuat pemangkas (indeks minmaks)
Untuk kolom string panjang, sistem membandingkan awalan string terhadap nilai minimum dan maksimum untuk mengurangi penggunaan memori. Panjang awalan default adalah 20 karakter, dan maksimum 255. Anda dapat menggunakan `PRUNER_MINMAX` untuk mengaktifkan minmax indexes string dan `PREFIX_LEN` untuk mengatur panjang awalan.
CatatanHitungan karakter didasarkan pada jumlah karakter, bukan panjang pengkodean. Misalnya, 2 karakter pertama dari "Alibaba Cloud PolarDB" adalah "Al", dan 5 karakter pertama adalah "Aliba".
Kluster yang menjalankan PolarDB MySQL 8.0 dengan revisi 8.0.1.1.32 atau lebih baru, atau 8.0.2.2.13 atau lebih baru, mendukung atribut
PRUNER_MINMAXdanPREFIX_LEN.
Bangun minmax indexes untuk semua kolom string. Contoh:
CREATE TABLE t1 ( id INT PRIMARY KEY, str_col1 char(10), str_col2 varchar(10) ) ENGINE InnoDB COMMENT "COLUMNAR=1 PRUNER_MINMAX=1 PREFIX_LEN=30"; /* atribut pruner_minmax dengan awalan 30 karakter */Bangun minmax indexes untuk kolom tertentu. Contoh:
CREATE TABLE t1 ( id INT PRIMARY KEY, str_col1 char(10) "PRUNER_MINMAX=1 PREFIX_LEN=30", /* pruner_minmax dengan awalan 30 karakter */ str_col2 varchar(10) "PRUNER_MINMAX=1 PREFIX_LEN=10" /* pruner_minmax dengan awalan 10 karakter */ ) ENGINE InnoDB COMMENT "COLUMNAR=1";
Bangun prefix bloom filter
CatatanKluster yang menjalankan PolarDB MySQL 8.0 dengan revisi 8.0.1.1.42 atau lebih baru, atau 8.0.2.2.25 atau lebih baru, mendukung atribut
PRUNER_PREFIX_BLOOM.Bangun prefix bloom filter untuk semua kolom yang didukung. Contoh:
CREATE TABLE t1 ( id INT PRIMARY KEY, str_col1 char(10), str_col2 varchar(10) ) ENGINE InnoDB COMMENT "COLUMNAR=1 PRUNER_PREFIX_BLOOM=1"; /* PRUNER_PREFIX_BLOOM dalam komentar tabel */Bangun prefix bloom filter untuk kolom tertentu. Contoh:
CREATE TABLE t1 ( id INT PRIMARY KEY, str_col1 char(10) "PRUNER_PREFIX_BLOOM=1", /* PRUNER_PREFIX_BLOOM dalam komentar kolom */ str_col2 varchar(10) ) ENGINE InnoDB COMMENT "COLUMNAR=1";
Membangun token bloom filter
CatatanAtribut
PRUNER_TOKEN_BLOOMdidukung pada versi berikut:PolarDB for MySQL 8.0.1, revisi 8.0.1.1.39 atau lebih baru.
PolarDB for MySQL 8.0.2, revisi 8.0.2.2.20 atau lebih baru.
Anda dapat membangun token bloom filter untuk semua kolom yang didukung. Contohnya:
CREATE TABLE t1 ( id INT PRIMARY KEY, str_col1 char(10), str_col2 varchar(10) ) ENGINE InnoDB COMMENT "COLUMNAR=1 PRUNER_TOKEN_BLOOM=1";Anda dapat membangun token bloom filter untuk kolom tertentu. Contohnya:
CREATE TABLE t1 ( id INT PRIMARY KEY, str_col1 char(10) "PRUNER_TOKEN_BLOOM=1", str_col2 varchar(10) ) ENGINE InnoDB COMMENT "COLUMNAR=1";
Bangun n-gram bloom filter
CatatanProperti
PRUNER_TOKEN_BLOOMdidukung pada versi Kluster yang memenuhi kondisi berikut:PolarDB MySQL 8.0.1 dengan revisi 8.0.1.1.39 atau lebih baru.
PolarDB MySQL 8.0.2 dengan revisi 8.0.2.2.20 atau lebih baru.
PRUNER_NGRAM_BLOOM=N: N harus bernilai 2 atau lebih besar dan menentukan panjang substring. Kami menyarankan agar Anda mengatur N ke nilai yang kurang dari atau sama dengan panjang string dalamLIKE "%string%". Jika string dalamLIKE "%string%"lebih pendek dari N, n-gram bloom filter tidak dapat digunakan.
Bangun n-gram bloom filter untuk semua kolom yang didukung. Contoh:
CREATE TABLE t1 ( id INT PRIMARY KEY, str_col1 char(10), str_col2 varchar(10) ) ENGINE InnoDB COMMENT "COLUMNAR=1 PRUNER_NGRAM_BLOOM=2";Bangun n-gram bloom filter untuk kolom tertentu. Contoh:
CREATE TABLE t1 ( id INT PRIMARY KEY, str_col1 char(10) "PRUNER_NGRAM_BLOOM=3", str_col2 varchar(10) ) ENGINE InnoDB COMMENT "COLUMNAR=1";
Bangun atau hapus pruner pada tabel yang sudah ada
Untuk menambahkan atau menghapus pruner pada tabel yang sudah ada, Anda harus membangun ulang indeks penyimpanan kolom dengan terlebih dahulu menghapusnya lalu membuatnya kembali. Sebelum membangun ulang indeks, perbarui atau hapus atribut pruner dalam COMMENT. Bagian berikut menggunakan PRUNER_MINMAX sebagai contoh.
Membuat pemangkas
Asumsikan struktur tabel asli adalah sebagai berikut:
Table: t1 Create Table: CREATE TABLE `t1` ( `id` int(11) NOT NULL, `str_col1` char(10) DEFAULT NULL, `str_col2` varchar(10) DEFAULT NULL, PRIMARY KEY (`id`), COLUMNAR INDEX (`id`,`str_col1`,`str_col2`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='COLUMNAR=1'Bangun pruner minmax untuk semua kolom string pada tabel
t1:Hapus indeks penyimpanan kolom pada tabel
t1.ALTER TABLE t1 COMMENT = "COLUMNAR=0";Aktifkan pruner minmax untuk semua kolom string pada tabel
t1.ALTER TABLE t1 COMMENT = "COLUMNAR=1 PRUNER_MINMAX=1";(Opsional) Lihat struktur tabel yang telah diperbarui.
SHOW CREATE TABLE t1 FULL \GHasil:
*************************** 1. row *************************** Table: t1 Create Table: CREATE TABLE `t1` ( `id` int(11) NOT NULL, `str_col1` char(10) DEFAULT NULL, `str_col2` varchar(10) DEFAULT NULL, PRIMARY KEY (`id`), COLUMNAR INDEX (`id`,`str_col1`,`str_col2`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='COLUMNAR=1 PRUNER_MINMAX=1'Tabel
t1sekarang mencakup atributPRUNER_MINMAX.
Bangun pruner minmax untuk kolom
str_col1pada tabelt1:Tambahkan pruner ke kolom
str_col1.ALTER TABLE t1 MODIFY COLUMN str_col1 char(10) COMMENT 'PRUNER_MINMAX=1';Jalankan perintah berikut secara berurutan untuk membangun ulang indeks penyimpanan kolom untuk tabel
t1.ALTER TABLE t1 COMMENT = "COLUMNAR=0"; ALTER TABLE t1 COMMENT = "COLUMNAR=1";(Opsional) Lihat struktur tabel yang telah diperbarui.
SHOW CREATE TABLE t1 FULL \GHasil:
*************************** 1. row *************************** Table: t1 Create Table: CREATE TABLE `t1` ( `id` int(11) NOT NULL, `str_col1` char(10) DEFAULT NULL COMMENT 'PRUNER_MINMAX=1', `str_col2` varchar(10) DEFAULT NULL, PRIMARY KEY (`id`), COLUMNAR INDEX (`id`,`str_col1`,`str_col2`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='COLUMNAR=1'Kolom
str_col1sekarang memiliki atributPRUNER_MINMAX.
Hapus pruner
Hapus atribut
PRUNER_MINMAXdari tabel.Asumsikan tabel
t1memiliki struktur berikut:SHOW CREATE TABLE t1 full \G *************************** 1. row *************************** Table: t1 Create Table: CREATE TABLE `t1` ( `id` int(11) NOT NULL, `str_col1` char(10) DEFAULT NULL, `str_col2` varchar(10) DEFAULT NULL, PRIMARY KEY (`id`), COLUMNAR INDEX (`id`,`str_col1`,`str_col2`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='COLUMNAR=1 PRUNER_MINMAX=1'Untuk menghapus atribut
PRUNER_MINMAXdari tabelt1:Jalankan perintah berikut untuk menghapus indeks penyimpanan kolom pada tabel
t1.ALTER TABLE t1 COMMENT = "COLUMNAR=0";Atur
PRUNER_MINMAXke 0 dan bangun ulang indeks.ALTER TABLE t1 COMMENT = "COLUMNAR=1 PRUNER_MINMAX=0";(Opsional) Lihat struktur tabel yang telah diperbarui.
SHOW CREATE TABLE t1 FULL \GHasil:
*************************** 1. row *************************** Table: t1 Create Table: CREATE TABLE `t1` ( `id` int(11) NOT NULL, `str_col1` char(10) DEFAULT NULL, `str_col2` varchar(10) DEFAULT NULL, PRIMARY KEY (`id`), COLUMNAR INDEX (`id`,`str_col1`,`str_col2`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='COLUMNAR=1'Tabel
t1tidak lagi memiliki atributPRUNER_MINMAX.
Hapus atribut
PRUNERdari kolom.Asumsikan kolom
str_col1pada tabelt1memiliki atributPRUNER_MINMAX. Struktur tabelnya adalah sebagai berikut:Table: t1 Create Table: CREATE TABLE `t1` ( `id` int(11) NOT NULL, `str_col1` char(10) DEFAULT NULL COMMENT 'PRUNER_MINMAX=1', `str_col2` varchar(10) DEFAULT NULL, PRIMARY KEY (`id`), COLUMNAR INDEX (`id`,`str_col1`,`str_col2`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='COLUMNAR=1'Untuk menghapus atribut
PRUNER_MINMAXdari kolomstr_col1:Hapus atribut
PRUNER_MINMAXdari kolomstr_col1.ALTER TABLE t1 MODIFY COLUMN str_col1 char(10) COMMENT 'PRUNER_MINMAX=0';Bangun ulang indeks penyimpanan kolom.
ALTER TABLE t1 COMMENT = "COLUMNAR=0"; ALTER TABLE t1 COMMENT = "COLUMNAR=1";(Opsional) Lihat struktur tabel yang telah diperbarui.
SHOW CREATE TABLE t1 FULL \GHasil:
*************************** 1. row *************************** Table: t1 Create Table: CREATE TABLE `t1` ( `id` int(11) NOT NULL, `str_col1` char(10) DEFAULT NULL, `str_col2` varchar(10) DEFAULT NULL, PRIMARY KEY (`id`), COLUMNAR INDEX (`id`,`str_col1`,`str_col2`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='COLUMNAR=1'Kolom
str_col1tidak lagi memiliki atributPRUNER_MINMAX.
Periksa apakah pruner telah dibangun pada kolom tabel
Verifikasi efektivitas pruner
Periksa menggunakan SHOW STATUS
Sebelum dan sesudah menjalankan kueri, Anda dapat menggunakan SHOW STATUS LIKE 'imci_pruner%' untuk memeriksa penyaringan blok data dan mengonfirmasi dampak pruner. Nilainya merupakan metrik kumulatif pruner untuk sesi saat ini. Untuk kueri multi-tabel, hasilnya dijumlahkan dari semua tabel. Nilai status dijelaskan sebagai berikut:
imci_pruner_accepted: Jumlah blok data yang sepenuhnya memenuhi kondisi filter.imci_pruner_rejected: Jumlah blok data yang gagal memenuhi kondisi filter.
Total jumlah blok yang dilewati adalah jumlah blok yang diterima ditambah blok yang ditolak.
Blok yang diterima melewati penyaringan per-catatan, meskipun materialisasi mungkin tetap memerlukan akses. Blok yang ditolak melewati proses pemindaian sepenuhnya, dan tidak terjadi I/O.
Example
Ambil tabel t1 sebagai contoh untuk menentukan apakah pruner efektif untuk pernyataan pencarian. Skema tabel t1 adalah sebagai berikut:
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int(11) NOT NULL,
`str_col1` char(10) DEFAULT NULL,
`str_col2` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`),
COLUMNAR INDEX (`id`,`str_col1`,`str_col2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='COLUMNAR=1 PRUNER=1'Asumsikan tabel berisi 10 blok data, dan catatan yang memenuhi kondisi str_col1='polardb' terkonsentrasi dalam satu blok data. Anda dapat melakukan langkah-langkah berikut untuk memeriksa apakah pruner berpengaruh pada pernyataan pencarian SELECT COUNT(1) FROM t1 WHERE str_col1='polardb'.
Periksa status pruner saat ini.
SHOW STATUS LIKE 'imci_pruner%';Hasil:
+----------------------+-------+ | Variable_name | Value | +----------------------+-------+ | imci_pruner_accepted | 0 | | imci_pruner_rejected | 0 | +----------------------+-------+ 2 rows in set (0.00 sec)Jalankan perintah berikut untuk mengkueri jumlah baris yang memenuhi kondisi
str_col1='polardb'.SELECT COUNT(1) FROM t1 WHERE str_col1='polardb';Hasil:
+----------+ | count(1) | +----------+ | 1 | +----------+ 1 row in set (0.01 sec)Periksa status pruner lagi.
SHOW STATUS LIKE 'imci_pruner%';Hasil:
+----------------------+-------+ | Variable_name | Value | +----------------------+-------+ | imci_pruner_accepted | 0 | | imci_pruner_rejected | 9 | +----------------------+-------+ 2 rows in set (0.00 sec)Nilai
imci_pruner_acceptedadalah 0 dan nilaiimci_pruner_rejectedadalah 9. Kueri melewati 9 blok, yang mengonfirmasi efektivitas pruner.
Periksa menggunakan imci_sql_profiling
Fitur ini hanya didukung di PolarDB MySQL 8.0 dengan revisi 8.0.1.1.5 atau lebih baru, atau 8.0.2.2.29 atau lebih baru.
Anda dapat mengkueri information_schema.imci_sql_profiling untuk melihat berapa banyak paket data yang difilter oleh operator Table Scan menggunakan pruner dalam rencana eksekusi. Berbeda dengan pemeriksaan menggunakan SHOW STATUS, metode ini menunjukkan penyaringan tingkat tabel yang langsung terkait dengan kueri. Perintah SHOW STATUS bersifat sesi dan memerlukan perhitungan delta manual. Oleh karena itu, metode ini lebih intuitif.
Aktifkan profiling kueri indeks penyimpanan kolom.
SET imci_analyze_query=ON;Jalankan kueri, misalnya:
SELECT count(*) from t1 WHERE v1 > 100; +--------------+ | count(*) | +--------------+ | 600 | +--------------+Periksa tabel
imci_sql_profiling.SELECT `Operator`, `Extra Info` from INFORMATION_SCHEMA.IMCI_SQL_PROFILING;+----+------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ | ID | Operator | Extra Info | +----+------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ | 1 | Select Statement | IMCI Execution Plan (max_dop = 32, real_dop = 32, max_query_mem = unlimited, real_query_mem = unlimited) | | 2 | └─Aggregation | | | 3 | └─Table Scan Cond: (v1 > 100), Pruner Counter: [AC: 8, RE: 1, PA: 2] | | +----+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+AC: 8menunjukkan bahwa 8 paket diterima.RE: 1menunjukkan bahwa 1 paket ditolak.PA: 2menunjukkan bahwa 2 paket sebagian cocok dan memerlukan penyaringan lebih lanjut.
Pengujian Performa
Bagian ini menjelaskan pengujian pada tabel dengan 120 juta baris, yang setara dengan sekitar 1.800 blok data, pada kluster 2-core, 4 GB. Kolom string col memiliki 80 juta nilai unik. Pengujian membandingkan performa kueri dengan dan tanpa bloom filter menggunakan pernyataan berikut:
SELECT COUNT(1) FROM t1 WHERE col='xxx'Waktu kueri adalah sebagai berikut:
Membangun Bloom filter | Tanpa bloom filter |
0,15 detik | 18,6 detik |
Kondisi col='xxx' dikombinasikan dengan bloom filter mengeliminasi sebagian besar blok data. Hanya beberapa blok yang dipindai, sehingga performa meningkat secara signifikan.