Topik Implementasi operator TopK di IMCI menjelaskan cara fitur Indeks Kolom dalam Memori (IMCI) dari PolarDB memanfaatkan statistik untuk memangkas data guna meningkatkan kinerja kueri algoritma TopK. Topik ini membahas metode pemangkasan IMCI.
Informasi latar belakang dan dampaknya
Dalam skenario pemrosesan transaksi/analitik hibrida (HTAP), fitur IMCI dari PolarDB menggunakan tabel heap berorientasi kolom sebagai arsitektur penyimpanan untuk mendukung pembaruan real-time. Indeks kolom sekunder SQL Server dan Oracle juga menggunakan arsitektur penyimpanan serupa. Namun, arsitektur penyimpanan yang menggunakan tabel heap tidak mengurangi jumlah data yang harus dipindai selama kueri. Dalam banyak kasus, diperlukan pemindaian tabel penuh. Untuk meminimalkan jumlah data yang harus dipindai dan mengurangi pemindaian tabel penuh, SQL Server menggunakan fungsi MIN() dan MAX(), partisi, serta indeks terkluster, sedangkan Oracle menggunakan fungsi MIN() dan MAX() serta kamus metadata berdasarkan indeks kolom dalam memori. Fitur IMCI dari PolarDB menggunakan tabel berorientasi kolom dan mendukung penyimpanan data untuk menyediakan metode yang lebih beragam dalam mengoptimalkan pemindaian tabel penuh.
Arsitektur penyimpanan | Fitur | Contoh |
Tabel heap berorientasi kolom |
|
|
Penyimpanan berorientasi kolom berbasis Log-structured merge (LSM) |
|
|
Fitur IMCI dari PolarDB mengorganisasikan data berdasarkan grup baris. Setiap grup baris berisi sekitar 64.000 baris. Indeks kolom setiap kolom disimpan tanpa urutan tertentu berdasarkan mode penulisan tambahan. Oleh karena itu, IMCI tidak dapat memfilter data berdasarkan kondisi kueri seakurat indeks terurut InnoDB. Saat IMCI membaca paket data, IMCI memuat paket data dari disk ke memori, mendekompresi paket data, melintasi semua catatan data dalam paket data, dan kemudian menemukan catatan data yang memenuhi kondisi kueri. Saat Anda memindai tabel besar, pemindaian tabel penuh menjadi tidak efisien dan memengaruhi cache LRU (Least Recently Used), yang meningkatkan latensi keseluruhan kueri dan mengurangi permintaan per detik (QPS).

Untuk mengurangi pemindaian tabel penuh, fitur IMCI dari PolarDB menyediakan metode pemangkasan. IMCI menggunakan pemangkasan untuk menyaring paket data yang tidak ingin Anda akses terlebih dahulu. Ini mengurangi jumlah data yang akan dikueri dan meningkatkan efisiensi kueri. Untuk menerapkan ini, IMCI menggunakan metode pemangkasan untuk mengakses partisi atau statistik dan memangkas data yang tidak memenuhi kondisi yang ditentukan sebelum data dikueri. Ini mengurangi jumlah pemindaian untuk data yang tersimpan dan jumlah sumber daya yang dikonsumsi untuk transfer data dan komputasi. Pemangkasan berlaku untuk kueri data dari tabel tunggal maupun beberapa tabel dan dapat meningkatkan kinerja kueri PolarDB IMCI.

Prinsip dasar dan metode penggunaan
Pemangkasan partisi
Metode pemangkasan partisi IMCI digunakan untuk menyaring partisi yang tidak perlu dikueri berdasarkan kunci partisi saat kueri dilakukan. Ini mengurangi jumlah data yang akan dikueri dan meningkatkan efisiensi kueri. IMCI mendukung metode partisi berikut: RANGE, LIST, dan HASH. Metode partisi RANGE atau LIST membagi tabel menjadi beberapa rentang atau daftar. Metode partisi HASH meng-hash data ke partisi yang berbeda. Saat menggunakan metode pemangkasan partisi, Anda harus menggunakan pernyataan kueri yang memenuhi kondisi partisi dan menentukan kondisi kueri berdasarkan kunci partisi.
Sebagai contoh, sebuah tabel bernama orders dibagi menjadi 12 partisi berdasarkan tanggal pesanan. Anda dapat mengeksekusi pernyataan berikut untuk mengkueri pesanan pada hari tertentu:
SELECT * FROM orders WHERE order_date = '2022-01-01';Saat IMCI menjalankan kueri, IMCI menemukan partisi yang memenuhi kondisi kueri berdasarkan tanggal pesanan dan hanya mengkueri data dari partisi tersebut. Ini mengurangi jumlah data yang akan dikueri dan meningkatkan efisiensi kueri. IMCI juga mendukung inferensi berdasarkan hubungan ekuivalen antara kolom yang digabungkan untuk melakukan pemangkasan partisi penuh. Sebagai contoh, kunci partisi Tabel R dan Tabel S adalah a, dan Anda mengeksekusi pernyataan kueri berikut: select count(1) from R,S where R.a = S.a and R.a > 10. Berdasarkan kondisi R.a = S.a dan R.a > 10, dapat disimpulkan bahwa S.a > 10, yang dapat digunakan untuk pemangkasan partisi Tabel S.
Daftar berikut menjelaskan algoritma pemangkasan untuk jenis partisi yang berbeda:
Untuk partisi yang dihasilkan dengan menggunakan metode partisi RANGE, titik batas partisi yang berbeda disimpan dalam array secara berurutan. Oleh karena itu, Anda dapat menggunakan metode pencarian biner untuk mencari partisi.
Untuk partisi yang dihasilkan dengan menggunakan metode partisi LIST, nilai daftar setiap partisi dan ID partisi membentuk tupel dalam format <value, part_id>. Tupel disimpan berdasarkan nilai daftar secara berurutan. Anda juga dapat menggunakan metode pencarian biner untuk mencari partisi.
Untuk partisi yang dihasilkan dengan menggunakan metode partisi HASH, nilai yang mungkin di-enumerasi untuk hashing, dan nilai hash dihitung untuk menentukan partisi mana yang mereka masuki. Algoritma pemangkasan ini hanya dapat digunakan untuk bidang integer ketika sejumlah kecil nilai perlu di-enumerasi.
Gambar berikut menunjukkan algoritma pemangkasan partisi.
Dalam penggunaan aktual, Anda harus memilih jenis partisi dan kunci partisi yang sesuai berdasarkan volume data dan persyaratan kueri untuk mencapai kinerja kueri optimal.
Pemangkasan statistik
IMCI menggunakan statistik pada paket data untuk menyaring paket data yang tidak perlu dikueri. Ini mirip dengan indeks lewati data di ClickHouse dan Knowledge Grid Infobright. Dalam IMCI, pemangkas membantu mengoptimalkan kinerja kueri. Saat kueri dilakukan, pemangkas IMCI menggunakan statistik dan kondisi kueri untuk memangkas data dan menentukan apakah paket data perlu dipindai. Karena statistik menempati sedikit memori, mereka dapat tetap berada di memori. Jika data dipangkas, jumlah operasi I/O dan jumlah penilaian berbasis kondisi berkurang. Dengan cara ini, kinerja kueri ditingkatkan.
Paket data mungkin berada dalam salah satu dari keadaan berikut setelah difilter oleh pemangkas IMCI: Accept (AC), Reject (RE), dan Partial Accept (PA). Jika paket data berada dalam keadaan Accept, IMCI tidak perlu memindai setiap catatan data dalam paket data, yang mengurangi overhead komputasi. Jika paket data berada dalam keadaan Reject, IMCI tidak perlu memuat paket data ke memori, yang mengurangi jumlah operasi I/O dan overhead komputasi serta mencegah cache LRU terpengaruh. Jika paket data berada dalam keadaan Partial Accept, IMCI perlu memindai lebih lanjut setiap catatan data dalam paket data untuk menemukan catatan data yang memenuhi kondisi kueri.
IMCI menyediakan dua jenis pemangkas: indeks minmax dan filter Bloom, yang cocok untuk skenario yang berbeda. Selain itu, IMCI mengoptimalkan kueri pada kolom nullable. Pemangkas IMCI dapat menyaring paket data yang berisi nilai null selama kueri untuk lebih mempercepat kueri.
Indeks minmax
Indeks minmax digunakan sebagai teknologi pengindeksan yang ditingkatkan untuk dataset besar. Indeks minmax memberikan pengambilan data yang cepat dan efisien dengan menyimpan nilai minimum dan maksimum setiap paket data untuk mengindeks dataset. Indeks minmax cocok untuk data dalam dataset dengan nilai kontinu, seperti timestamp atau nilai nyata. Indeks minmax membagi dataset menjadi paket data, lalu menghitung nilai minimum dan maksimum setiap paket data, yang disimpan dalam indeks. Saat data dikueri, indeks minmax dapat dengan cepat menemukan paket data yang akan dikueri berdasarkan nilai minimum dan maksimum rentang kueri, sehingga mengurangi akses ke data yang tidak relevan. Gambar berikut menunjukkan contohnya. Dalam contoh ini, baik Kolom A maupun Kolom B berisi tiga paket data. Berdasarkan kondisi A > 15 dan B < 10 dan indeks minmax, Grup Baris 2 dan Grup Baris 3 dapat dilewati, dan hanya Grup Baris 1 yang perlu diakses. Ini mengurangi beban pemindaian sebesar dua pertiga.

Indeks minmax dapat memproses dataset besar dalam waktu singkat. Ini mengurangi jumlah data yang harus dipindai selama kueri karena hanya perlu memproses paket data yang relevan dengan rentang kueri. Selain itu, indeks minmax membantu mengurangi ruang yang diperlukan untuk menyimpan indeks karena hanya perlu menyimpan nilai minimum dan maksimum setiap paket data, bukan indeks semua data.
Filter Bloom
Filter Bloom adalah struktur data probabilistik yang digunakan untuk memeriksa apakah elemen merupakan anggota dari suatu himpunan. Filter Bloom menggunakan larik bit dan serangkaian fungsi hash untuk menyimpan dan mencari elemen. Saat elemen ditambahkan ke himpunan dengan filter Bloom, fungsi hash memetakan elemen ke beberapa bit dalam larik bit dan mengatur bit yang sesuai menjadi 1. Saat filter Bloom digunakan untuk memeriksa apakah elemen merupakan anggota himpunan, fungsi hash diterapkan lagi ke elemen. Jika semua bit yang sesuai adalah 1, elemen mungkin ada dalam himpunan. Namun, jika salah satu bit yang sesuai adalah 0, elemen tidak ada dalam himpunan. Filter Bloom adalah struktur data yang efisien dalam hal ruang dan waktu. Namun, positif palsu dapat terjadi. Dalam hal ini, saat Anda mengkueri elemen yang tidak ada dalam himpunan, filter Bloom mungkin salah melaporkan bahwa elemen ada dalam himpunan.

Filter Bloom efisien dalam hal ruang dan waktu, skalabel, dan memiliki tingkat kesalahan yang dapat dikontrol. Fitur-fitur ini membuat filter Bloom menjadi struktur data yang berguna untuk memeriksa apakah elemen ada dalam dataset besar.
Filter Bloom dan indeks minmax dapat digunakan bersama-sama. IMCI menentukan apakah akan melewati paket data berdasarkan hasil yang dihasilkan setelah digunakan bersama.
Optimasi kueri pada kolom nullable
Karena logika pemrosesan khusus untuk nilai null, indeks basis data tidak sepenuhnya mendukung kolom dengan nilai null dalam banyak kasus. Basis data yang berbeda memproses kolom nullable dengan cara yang berbeda.
Fitur IMCI dari PolarDB mengoptimalkan kueri pada kolom nullable. Ini mengurangi dampak nilai null pada kinerja kueri. Saat menggunakan PolarDB, kolom yang berisi nilai null sering digunakan. Jika Anda ingin menggunakan nilai default untuk menggantikan nilai null, Anda harus melakukan operasi DDL untuk mengubah skema tabel dan mungkin juga perlu mengubah pernyataan SQL yang ada untuk mengkueri data bisnis. Fitur IMCI dari PolarDB memungkinkan Anda membuat indeks minmax dan filter Bloom untuk kolom dengan nilai null untuk mendukung kueri yang berisi predikat seperti IS Null, IS NOT Null, >, <, dan =.

Jika paket data berisi nilai null, nilai tersebut dilewati saat pemangkas dibangun. Sebagai contoh, paket data berisi empat entri data: 1, 2, 3, dan null. Nilai minimum adalah 1 dan nilai maksimum adalah 3. Selama kueri pada paket data, kueri diproses dengan nilai null diabaikan, dan kemudian hasil pemrosesan dikonversi berdasarkan apakah paket data berisi nilai null. Gambar di atas menunjukkan contohnya. Dalam contoh ini, Pack A1 hanya berisi nilai null. Baik Pack A2 maupun Pack A3 sebagian berisi nilai null. Berdasarkan kondisi A > 15, [PA, AC, RE] diperoleh sebagai hasil tanpa mempertimbangkan nilai null. Karena Pack A1 hanya berisi nilai null, ia tidak dapat disaring. Kemudian, hasilnya dikonversi menjadi [RE, PA, RE] berdasarkan fakta bahwa setiap paket data berisi nilai null. Akhirnya, Pack A1 dan Pack A3 dapat dipangkas. Ini meningkatkan kinerja kueri.
Filter runtime
Filter runtime digunakan untuk optimasi kueri. Filter ini dibuat secara dinamis selama kueri. Selama kueri, filter runtime dapat menyaring data yang tidak memenuhi kondisi yang ditentukan berdasarkan nilai data yang dipindai atau informasi lainnya. Ini mengurangi jumlah data yang akan dikueri dan meningkatkan kinerja kueri. IMCI menyediakan dua jenis filter runtime umum: filter Bloom dan filter minmax. Mereka dapat diterapkan pada berbagai kueri, seperti JOIN, GROUP BY, dan ORDER BY.
Sebagai contoh, fitur IMCI dari PolarDB mengoptimalkan kueri TopK yang menggunakan sintaks ORDER BY LIMIT kolom. Anda dapat menggunakan filter input self-sharpening yang dibangun oleh operator TopK dan indeks minmax yang dibuat pada paket data di lapisan penyimpanan untuk melakukan pemangkasan. Ini mempercepat kueri TopK. Untuk informasi lebih lanjut, lihat bagian Pushdown komputasi dari topik "Implementasi operator TopK di IMCI".
Selain itu, filter runtime dapat digunakan untuk mempercepat join hash. Sebagai contoh, Anda ingin mengeksekusi pernyataan SELECT * FROM sales JOIN items ON sales.item_id = items.id WHERE items.price > 1000. Dalam pernyataan ini, tabel sales adalah tabel fakta, dan tabel items adalah tabel dimensi. Tabel items kecil. Jumlah catatan data yang dikembalikan dapat dikurangi lebih lanjut berdasarkan kondisi berikut: price > 1000. Saat tabel sales dan tabel items digabungkan, filter runtime dapat dibangun berdasarkan set hasil item_id yang memenuhi kondisi yang ditentukan. Jika nilai minimum adalah 1 dan nilai maksimum adalah 100, ekspresi filter id > 1 dan id < 100 atau ekspresi in(id1,id2,id3 ...) dapat dihasilkan. Filter runtime diteruskan ke tabel kiri. Saat catatan data tabel kiri dipindai untuk probe, filter runtime dapat menyaring catatan data yang tidak memenuhi kondisi yang ditentukan terlebih dahulu untuk mengurangi jumlah probe. Untuk data tipe STRING, Anda dapat membuat filter Bloom untuk set hasil tabel kanan untuk menyaring data tipe STRING terlebih dahulu. Filter Bloom meningkatkan overhead sumber daya dan tidak cocok untuk set hasil besar. Jika pemangkas ada pada kolom tabel kiri, pemangkas dapat menyaring catatan data berdasarkan filter runtime untuk mengurangi paket data yang harus dipindai. Dalam skenario pemrosesan paralel massal (MPP), filter runtime dapat membantu mengurangi jumlah data yang harus di-shuffle.
Indeks bitmap
Indeks bitmap juga digunakan dalam penyimpanan berorientasi baris. Sebagai contoh, Oracle menyediakan indeks bitmap, yang cocok untuk kolom dengan kardinalitas rendah. Dalam indeks bitmap, setiap nilai berbeda dalam kolom diberi bit yang mewakili keberadaan atau ketiadaan nilai dalam setiap baris tabel. Saat data difilter selama kueri, Anda dapat memperoleh informasi bitmap berdasarkan nilai kolom untuk menemukan baris. Ini sangat cocok untuk kueri yang berisi predikat seperti AND atau OR untuk beberapa kolom. Dalam banyak kasus, indeks B-tree yang membantu menyaring dan menemukan catatan data cocok untuk kolom dengan kardinalitas tinggi. Indeks B-tree melengkapi indeks bitmap. Indeks B-tree cocok untuk skenario di mana pola pencarian tetap. Indeks bitmap juga dapat digunakan dalam skenario ini. Namun, indeks B-tree tidak sepenuhnya kompatibel dengan kueri yang berisi predikat OR.
Indeks bitmap menempati lebih sedikit ruang penyimpanan dibandingkan indeks B-tree untuk kolom dengan kardinalitas rendah. Gambar berikut menunjukkan contohnya. Dalam contoh ini, indeks bitmap dibuat untuk kolom GENDER dan RANK tabel. Tabel berisi hanya lima baris. Bitmap yang sesuai dengan satu nilai kolom hanya membutuhkan lima bit. Dibandingkan dengan indeks B-tree tradisional, indeks bitmap membutuhkan lebih sedikit ruang penyimpanan, dan ruang penyimpanan yang diperlukan tergantung pada kardinalitas dan jumlah total baris. Untuk indeks bitmap global, karena karakteristik indeks bitmap, Anda harus memelihara indeks bitmap dan mengunci seluruh tabel jika Anda memodifikasi satu baris tabel. Oleh karena itu, indeks bitmap global cocok untuk skenario di mana jumlah data yang dibaca lebih banyak daripada data yang ditulis.
Fitur IMCI dari PolarDB mendukung indeks bitmap untuk paket data. Nomor baris data yang diperlukan dapat langsung dikembalikan berdasarkan indeks bitmap. Ini mengurangi akses ke paket data.
Manfaat dan skenario
Fitur IMCI dari PolarDB mendukung berbagai metode pemangkasan yang saling melengkapi. Anda dapat menggunakan metode berdasarkan karakteristik data dan skenario kueri Anda. Jika Anda ingin menggunakan metode pemangkasan yang didukung oleh PolarDB IMCI, pastikan data Anda terdistribusi. Semakin terdistribusi data, semakin baik efek pemangkasan. Namun, data mungkin tidak terdistribusi seperti yang diharapkan dalam skenario aktual. Dalam hal ini, Anda harus merencanakan dengan hati-hati untuk mendistribusikan data.
Pemangkasan partisi: Untuk menggunakan metode ini, Anda harus memilih kunci partisi yang sesuai untuk membuat tabel partisi. Data didistribusikan terlebih dahulu berdasarkan kunci partisi. Dalam banyak kasus, data yang tidak relevan disaring seperti yang diharapkan. Jika sebagian besar kondisi kueri yang Anda tentukan berisi kunci partisi dan Anda ingin mengelola siklus hidup data berdasarkan partisi, Anda dapat memangkas tabel partisi dan membuat partisi level-1 atau level-2 berdasarkan kebutuhan bisnis Anda.
Indeks minmax: Untuk menggunakan pemangkas ini, data dalam kolom harus terdistribusi dengan baik dan mendukung kueri rentang. Sebagai contoh, data tipe TIMESTAMP dimasukkan ke dalam tabel secara berurutan. Indeks minmax yang dibuat pada kolom tipe TIMESTAMP memfasilitasi penyaringan data.
Filter Bloom: Filter Bloom dapat digunakan untuk meningkatkan kinerja penyaringan kondisi ekuivalen dan kondisi IN. Ini memberikan hasil penyaringan yang diharapkan berdasarkan kondisi ekuivalen dengan kinerja penyaringan yang baik. Sebagai contoh, Anda dapat menggunakan filter Bloom untuk berbagai ID yang dihasilkan secara acak. Dalam banyak kasus, satu ID hanya sesuai dengan sejumlah kecil catatan data. Kondisi filter ekuivalen yang berisi ID tersebut dapat memangkas data yang tidak memenuhi kondisi.
Indeks bitmap cocok untuk kueri dengan kondisi filter tunggal atau beberapa kondisi filter yang kuat, serta kueri yang tidak memerlukan materialisasi data, seperti
select count(*) from t where xxx.
Batasan dan solusi
Berbagai metode pemangkasan IMCI memiliki batasannya masing-masing. Dalam skenario aktual, mereka harus dikombinasikan dengan beberapa metode untuk meningkatkan kemampuan pemangkasan data.
Pemangkasan partisi: Biaya tinggi dihasilkan saat operasi DDL dilakukan pada data yang ada. Selain itu, kondisi kueri harus berisi kunci partisi agar efektif. Anda dapat melakukan operasi DDL pada data yang ada selama jam-jam sepi. Jika sebagian besar kondisi kueri tidak berisi kunci partisi, kami sarankan Anda menggunakan metode lain untuk mengoptimalkan kueri.
Pemangkasan statistik: Statistik diurutkan tanpa urutan tertentu. Oleh karena itu, statistik kurang efektif dalam skenario di mana data tersebar merata dan terdistribusi. Anda dapat menggunakan salah satu solusi optimasi berikut:
Kurangi ukuran paket data. Untuk indeks minmax dan filter Bloom, ukuran paket data yang lebih kecil menunjukkan indeks yang lebih halus dan efek pemangkasan yang lebih baik dalam banyak kasus. IMCI memungkinkan Anda mengubah ukuran paket data tabel. Namun, jika ukuran paket data dikurangi, paket data mungkin menempati lebih banyak sumber daya memori.
Urutkan data. Jika data didistribusikan secara acak, Anda dapat menggunakan fitur kunci sortir PolarDB IMCI untuk melakukan pemangkasan statistik.
Nonaktifkan pemangkas. Pemangkasan statistik mungkin tidak membantu mengoptimalkan kueri tetapi menghasilkan overhead komputasi dan memori. Filter Bloom juga meningkatkan overhead I/O. Dalam hal ini, Anda dapat menonaktifkan pemangkas selama kueri.
Uji kinerja
Bagian ini menguji kinerja pemangkas dan indeks bitmap dalam skenario HTAP PolarDB. Pemangkas termasuk indeks minmax dan filter Bloom. Dataset uji menggunakan 100 GB data TPC-H. Beberapa kueri tipikal diuji, termasuk kueri titik dan kueri rentang. Tipe data melibatkan tipe NUMERIC dan STRING.
Uji pernyataan SQL
Keefektifan indeks ringan bergantung pada distribusi data dan jenis kueri. Keefektifan indeks ringan diuji dengan cara berikut: Beberapa pernyataan SQL yang dibangun berdasarkan operator pemindaian digunakan untuk membandingkan efek percepatan sebelum dan sesudah menggunakan pemangkas dan indeks bitmap. Lingkungan pengujian menggunakan penyimpanan dalam memori dan konkurensi diatur menjadi 1. Dalam skenario yang melibatkan I/O, efek percepatan indeks lebih baik.
Q1:select count(*) from partsupp where ps_suppkey = 41164;
Q2:select count(*) from partsupp where ps_suppkey in (41164,58321);
Q3:select count(*) from partsupp where ps_suppkey between 40000 and 50000;
Q4:select count(*) from orders where o_clerk = 'Clerk#000068170';
Q5:select count(*) from orders where o_clerk in ('Clerk#000068170', 'Clerk#000087784');
Q6:select count(*) from customer where c_mktsegment = 'AUTOMOBILE';
Q7:select count(*) from customer where c_mktsegment in ('AUTOMOBILE','FURNITURE','BUILDING');
Q8:select count(*) from customer where c_mktsegment = 'AUTOMOBILE' or c_phone = '18-338-906-3675';
Q9:select count(*) from customer where c_mktsegment = 'AUTOMOBILE' and c_phone = '18-338-906-3675';Hasil pengujian
Q1 hingga Q5 memverifikasi efek percepatan pemangkas. Kueri pada kolom ps_suppkey tabel partsupp dapat dipercepat dengan menggunakan indeks minmax dan kueri pada kolom o_clerk tabel orders dapat dipercepat dengan menggunakan filter Bloom. Rasio percepatan sebanding dengan jumlah paket data yang difilter.
Tabel berikut membandingkan durasi kueri.
Pernyataan SQL
Durasi query (detik)
Durasi pernyataan SQL (detik)
Durasi pernyataan SQL menggunakan pruner (detik)
Q1
0,11
0,05
Q2
0,14
0,07
Q3
0,13
0,06
Q4
0,89
0,43
Q5
1,85
1,35
Gambar berikut membandingkan durasi kueri.

Q6 hingga Q9 memverifikasi efek percepatan indeks bitmap. Nilai kolom c_mktsegment tabel customer didistribusikan secara merata di setiap paket data. Oleh karena itu, pemangkas saja tidak dapat mempercepat eksekusi pernyataan SQL. Eksekusi pernyataan SQL dapat dipercepat dengan menggunakan pemangkas dan indeks bitmap bersama-sama.
Tabel berikut membandingkan durasi kueri.
Pernyataan SQL
Durasi query (detik)
Durasi pernyataan SQL (detik)
Durasi pernyataan SQL menggunakan pruner (detik)
Durasi pernyataan SQL menggunakan pruner dan indeks bitmap (detik)
Q6
1,43
1,43
0,03
Q7
3,49
3,49
0,07
Q8
2,48
2,48
1,09
Q9
1,25
0,05
0,05
Gambar berikut membandingkan durasi kueri.
