All Products
Search
Document Center

PolarDB:Partial\ Result\ Cache\ \(PTRC\)

Last Updated:Mar 29, 2026

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.

AspekCache kueri tradisionalPTRC
GranularitasSeluruh hasil kueriHasil antara tingkat operator
Siklus hidupBertahan lintas kueriHanya satu kueri
Konsistensi nodeDapat menyebabkan inkonsistensi antar nodeTidak ada risiko inkonsistensi
Cakupan penerapanSempitLebih 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:

  1. Operator tersebut bergantung pada parameter berkorelasi dan dijalankan beberapa kali dalam satu kueri. Subkueri berkorelasi dan nested loop join merupakan contoh khas.

  2. 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.

PTRC execution flow

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

PTRC execution plan

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.

ParameterTingkatDefaultNilai validDeskripsi
partial_result_cache_enabledGlobal/SesiONON, OFFMengaktifkan atau menonaktifkan PTRC.
partial_result_cache_cost_thresholdGlobal/Sesi100000–18446744073709551615Threshold biaya kueri. PTRC hanya dipertimbangkan jika total biaya kueri melebihi nilai ini.
partial_result_cache_check_frequencyGlobal/Sesi2000–18446744073709551615Jumlah cache miss antara perhitungan ulang tingkat hit oleh mekanisme umpan balik dinamis.
partial_result_cache_low_hit_rateGlobal/Sesi200–100Ambang 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_rateGlobal/Sesi700–100Ambang 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_sizeGlobal/Sesi671088640–18446744073709551615Ukuran 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) / fanout
  • fanout: 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:

KondisiAksi
Tingkat hit < partial_result_cache_low_hit_rateNonaktifkan PTRC untuk sisa kueri.
Laju hit > partial_result_cache_high_hit_rateDump 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 batasTerapkan 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.

TPC-H Q17 subqueryExecution plan with PTRC enabledPerformance test results

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).