Partial Result Cache (PTRC) menyimpan cache set hasil antara yang dihasilkan oleh operator tertentu dalam suatu kueri dan menggunakannya kembali pada eksekusi berikutnya dari operator yang sama. PTRC memberikan kinerja terbaik ketika parameter berkorelasi dari suatu operator memiliki banyak nilai duplikat di tabel penggerak — semakin banyak duplikat, semakin tinggi tingkat hit cache, dan semakin besar keuntungan performa.
Cara kerja
PTRC bersifat "parsial" dalam dua hal:
Menyimpan cache set hasil antara dari operator tertentu, bukan seluruh hasil kueri.
Bahkan untuk operator yang memenuhi syarat, tidak semua set hasil disimpan dalam cache — cakupan cache dibatasi oleh batas memori.
| Aspek | Cache kueri tradisional | PTRC |
|---|---|---|
| Granularitas | Seluruh hasil kueri | Hasil antara tingkat operator |
| Siklus hidup | Bertahan lintas kueri | Hanya satu kueri |
| Konsistensi node | Dapat menyebabkan inkonsistensi antar node | Tidak ada risiko inkonsistensi |
| Cakupan penerapan | Sempit | Lebih luas |
PTRC menyimpan hasil dalam bentuk pasangan kunci-nilai, di mana kuncinya adalah parameter berkorelasi dari operator dan nilainya adalah hasil antara yang di-cache. Setiap kali operator dijalankan, sistem memeriksa apakah kunci tersebut ada dalam cache:
Cache miss: operator dijalankan dan hasilnya ditambahkan ke cache.
Cache hit: hasil yang di-cache dikembalikan langsung, melewati eksekusi.
Operator yang memenuhi syarat
Suatu operator memenuhi syarat untuk PTRC jika kedua kondisi berikut terpenuhi:
Operator tersebut bergantung pada parameter berkorelasi dan dijalankan beberapa kali dalam satu kueri. Subkueri berkorelasi dan nested loop join merupakan contoh khas.
Parameter berkorelasinya tidak berubah antar eksekusi — operator yang mengandung fungsi non-deterministik seperti
RAND(),NOW(), atau user-defined functions (UDFs) tidak memenuhi syarat.
Parameter berkorelasi adalah nilai dari query luar yang menjadi acuan operator tersebut.
Contoh: TPC-H Q17
TPC-H Q17 menggambarkan cara kerja PTRC dalam praktik.
select
sum(l_extendedprice) / 7.0 as avg_yearly
from
lineitem,
part
where
p_partkey = l_partkey
and p_brand = 'Brand#34'
and p_container = 'MED BOX'
and l_quantity < (
select
0.2 * avg(l_quantity)
from
lineitem
where
l_partkey = p_partkey
);Subkueri berkorelasi dijalankan sekali untuk setiap baris yang dihasilkan oleh join antara part dan lineitem. Parameter berkorelasinya adalah p_partkey — kolom tabel penggerak yang digunakan dalam kondisi join. Karena hasil join berisi banyak baris dengan nilai p_partkey yang sama, PTRC menyimpan cache hasil subkueri untuk setiap nilai p_partkey yang berbeda dan menggunakannya kembali untuk baris-baris berikutnya dengan nilai yang sama. Kuncinya adalah p_partkey; nilainya adalah true or false.

Untuk memastikan PTRC aktif, jalankan EXPLAIN pada kueri tersebut. Operator bernama Partial result cache akan muncul sebelum subkueri dalam rencana eksekusi.

Prasyarat
Sebelum mengaktifkan atau menyesuaikan PTRC, pastikan kluster Anda memenuhi persyaratan berikut:
Kluster PolarDB for MySQL yang menjalankan MySQL 8.0
Versi revisi 8.0.2.2.9 atau lebih baru
Untuk memeriksa versi kluster Anda, lihat Engine versions.
Parameter
PTRC diaktifkan secara default dan dikontrol melalui enam parameter. Secara bersamaan, parameter-parameter ini menentukan tiga aspek perilaku PTRC: apakah akan digunakan, kapan digunakan, dan apa yang dilakukan saat memori penuh.
| Parameter | Tingkat | Default | Nilai valid | Deskripsi |
|---|---|---|---|---|
partial_result_cache_enabled | Global/Sesi | ON | ON, OFF | Mengaktifkan atau menonaktifkan PTRC. |
partial_result_cache_cost_threshold | Global/Sesi | 10000 | 0–18446744073709551615 | Threshold biaya kueri. PTRC hanya dipertimbangkan jika total biaya kueri melebihi nilai ini. |
partial_result_cache_check_frequency | Global/Sesi | 200 | 0–18446744073709551615 | Jumlah cache miss antara perhitungan ulang tingkat hit oleh mekanisme umpan balik dinamis. |
partial_result_cache_low_hit_rate | Global/Sesi | 20 | 0–100 | Ambang batas bawah tingkat hit (persentase). PTRC tidak digunakan jika perkiraan tingkat hit berada di bawah nilai ini, dan dinonaktifkan di tengah kueri jika tingkat hit aktual turun di bawahnya. Harus lebih rendah daripada partial_result_cache_high_hit_rate. |
partial_result_cache_high_hit_rate | Global/Sesi | 70 | 0–100 | Ambang batas atas tingkat hit (persentase). Saat batas memori tercapai, hasil yang di-cache di-dump ke disk jika tingkat hit melebihi nilai ini. Harus lebih tinggi daripada partial_result_cache_low_hit_rate. |
partial_result_cache_max_mem_size | Global/Sesi | 67108864 | 0–18446744073709551615 | Ukuran maksimum memori yang dapat digunakan PTRC untuk satu kueri, dalam byte. Nilai default adalah 64 MiB. |
Cara pengoptimal memutuskan apakah akan menggunakan PTRC
PTRC mengonsumsi sumber daya — melakukan pencarian cache pada setiap eksekusi operator dan menyimpan hasil cache di memori. Pengoptimal kueri menggunakan partial_result_cache_cost_threshold dan partial_result_cache_low_hit_rate untuk menentukan apakah manfaatnya sebanding dengan biayanya.
Langkah 1: Pemeriksaan biaya
Jika total biaya kueri berada di bawah partial_result_cache_cost_threshold, pengoptimal melewati PTRC sepenuhnya. Untuk kueri singkat, overhead pencarian cache bisa lebih besar daripada keuntungan performa apa pun.
Langkah 2: Estimasi tingkat hit
Jika biaya kueri melebihi threshold, pengoptimal mengidentifikasi semua operator yang memenuhi syarat dan memperkirakan tingkat hit untuk masing-masing:
hit_rate = (fanout - ndv) / fanoutfanout: jumlah total eksekusi operator.ndv: jumlah nilai berbeda dari parameter berkorelasi (kunci cache).
Jika perkiraan tingkat hit berada di bawah partial_result_cache_low_hit_rate, PTRC tidak digunakan untuk operator tersebut.
Ketika estimasi tidak tersedia
Pengoptimal mengandalkan Indeks atau Histogram untuk memperkirakan ndv. Jika kolom parameter berkorelasi tidak memiliki keduanya, ndv tidak dapat diperkirakan secara akurat. Dalam kasus tersebut, pengoptimal mengaktifkan PTRC tanpa estimasi tingkat hit dan menyerahkan keputusan kepada mekanisme umpan balik dinamis saat waktu proses.
Mekanisme umpan balik dinamis
Saat waktu proses, PTRC memantau tingkat hit dan penggunaan memorinya sendiri serta menyesuaikan perilaku sesuai kebutuhan.
Tingkat hit dihitung ulang setiap partial_result_cache_check_frequency cache miss (default: setiap 200 miss). Tingkat hit juga dihitung ulang saat penggunaan memori mencapai partial_result_cache_max_mem_size.
Berdasarkan tingkat hit saat ini, salah satu dari tiga aksi berikut diambil:
| Kondisi | Aksi |
|---|---|
Tingkat hit < partial_result_cache_low_hit_rate | Nonaktifkan PTRC untuk sisa kueri. |
Laju hit > partial_result_cache_high_hit_rate | Dump cache di memori ke disk. Entri cache baru juga ditulis ke disk. Degradasi performa minimal karena tingkat hit tinggi. |
| Tingkat hit berada di antara dua ambang batas | Terapkan eviksi LRU (Least Recently Used): hapus entri yang paling jarang digunakan dan simpan data baru. Jika memori kembali penuh, mekanisme umpan balik dipicu lagi. |
Saat batas memori tercapai, mekanisme umpan balik dipicu untuk semua operator yang telah mengaktifkan PTRC dalam kueri tersebut.
Pertimbangan performa
Dua faktor menentukan seberapa besar peningkatan performa yang diberikan PTRC:
Biaya operator: semakin tinggi biaya operator yang di-cache, semakin besar keuntungannya. Untuk operator murah, peningkatannya minimal.
Tingkat hit cache: semakin tinggi tingkat hit, semakin besar keuntungannya.
Pada TPC-H Q17, tingkat hit cache mencapai 96%. Gambar berikut menunjukkan kueri dan rencana eksekusinya dengan PTRC diaktifkan, beserta peningkatan performanya.



PTRC dirancang untuk kueri dengan operator kompleks yang bergantung pada parameter berkorelasi. Operator yang cocok untuk PTRC meliputi subkueri berkorelasi dan nested loop join (inner join, outer join, semi join, dan anti join).