PolarDB for PostgreSQL (Kompatibel dengan Oracle) menyediakan fitur Outline untuk menangkap, melihat, dan menghapus rencana eksekusi tetap.
Ikhtisar
Manajemen Rencana SQL (SPM) adalah mekanisme pencegahan. SPM memungkinkan pengoptimal secara otomatis mengelola rencana eksekusi guna memastikan bahwa database Anda hanya menggunakan rencana eksekusi yang diketahui atau diverifikasi.
SPM menyediakan fitur Outline. Fitur Outline hanya mendukung rencana eksekusi tetap dan tidak mendukung rencana eksekusi yang berkembang. Fitur Outline dari PolarDB dapat digunakan untuk menandai rencana eksekusi dari pernyataan PREPARE saja sebagai rencana eksekusi tetap.
Fitur Outline di PolarDB diimplementasikan menggunakan ekstensi polar_outline. Untuk menggunakan fitur ini, buka Pusat Kuota. Klik Apply di kolom Actions yang sesuai dengan polardb_pg_polar_outline.
Membuat ekstensi polar_outline
Untuk membuat ekstensi polar_outline, jalankan pernyataan berikut:
CREATE EXTENSION polar_outline;Konfigurasikan parameter
Untuk menggunakan fitur Outline dalam menandai rencana eksekusi sebagai rencana eksekusi tetap, jalankan pernyataan berikut:
SET polar_outline.use_stored_plan TO ON;Fungsi dan relasi yang didefinisikan oleh fitur Outline disimpan dalam skema polar_outline. Anda dapat menjalankan pernyataan berikut untuk menambahkan skema polar_outline ke jalur pencarian:
SET search_path To "$user",public,polar_outline;Siapkan data uji
Jalankan pernyataan berikut untuk membuat tabel bernama t dan menyisipkan data ke dalam tabel:
CREATE TABLE t(a INT,b INT);
INSERT INTO t SELECT i, i FROM generate_series(1, 1000)i;Perbarui data dalam tabel untuk memastikan bahwa pengoptimal menggunakan statistik yang akurat.
ANALYZE t;Jalankan pernyataan PREPARE. Berikut adalah contoh kode:
PREPARE test AS SELECT * FROM t WHERE a=$1;- Data uji hanya berlaku untuk contoh dalam bagian ini. Modifikasi pernyataan berdasarkan kebutuhan bisnis Anda.
- Fitur Outline memberikan petunjuk untuk mengontrol rencana eksekusi yang ditangkap. Jika Anda menggunakan petunjuk dalam pernyataan, rencana eksekusi dari pernyataan tersebut akan ditangkap. Kemudian, jika Anda menjalankan pernyataan ini tanpa petunjuk, pernyataan tersebut masih akan dieksekusi berdasarkan rencana eksekusi yang telah ditangkap.
Tangkap rencana eksekusi dan tandai mereka sebagai rencana tetap
PolarDB for Oracle menyediakan metode berikut untuk menangkap rencana eksekusi dan menandai rencana eksekusi sebagai rencana eksekusi tetap:
- Panggil fungsi polar_outline_create untuk menangkap rencana eksekusi. Kami merekomendasikan Anda menggunakan metode ini. Sebagai contoh, jalankan pernyataan berikut:
SELECT polar_outline_create('EXECUTE test(100)');Informasi berikut akan dikembalikan:
polar_outline_create ---------------------- t (1 row) - Gunakan fitur Outline untuk menangkap rencana eksekusi. Metode ini dapat digunakan untuk menangkap beberapa rencana eksekusi sekaligus. Untuk menggunakan fitur Outline dalam menangkap rencana eksekusi, lakukan langkah-langkah berikut:Penting Jika fitur Outline digunakan untuk menangkap rencana eksekusi, cache rencana akan dibuat.
- Jalankan pernyataan berikut untuk mengizinkan fitur Outline menangkap rencana eksekusi:
SET polar_outline.capture_plan TO ON; - Jalankan pernyataan berikut untuk menangkap rencana eksekusi:
EXECUTE test(100);Informasi berikut akan dikembalikan:
a | b -----+----- 100 | 100 (1 row) - Jika Anda tidak ingin menggunakan fitur Outline untuk menangkap rencana eksekusi, jalankan pernyataan berikut:
SET polar_outline.capture_plan TO OFF;
- Jalankan pernyataan berikut untuk mengizinkan fitur Outline menangkap rencana eksekusi:
Parameter
| Parameter | Deskripsi |
| use_stored_plan | Menentukan apakah akan mengizinkan fitur Outline menandai rencana eksekusi sebagai rencana eksekusi tetap.
|
| capture_plan | Menentukan apakah akan mengizinkan fitur Outline menangkap rencana eksekusi.
|
| log_usage | Menentukan tingkat log Outline yang akan dicetak. |
Menggunakan fitur Outline untuk menulis ulang kueri
SQL1:
select t.a, t2.avg_b
from t join (select avg(b) as avg_b, a
from t2
group by a) t2
on t2.a = t.a and t.c < $1
order by t.a;
SQL2:
select t.a, t2.avg_b
from t join lateral (select avg(b) as avg_b
from t2
where t2.a = t.a) as t2
on t.c < $1
order by t.a;Anda dapat melakukan langkah-langkah berikut untuk menggunakan fitur Outline mengganti rencana eksekusi SQL1 dengan rencana eksekusi SQL2:
- Jalankan pernyataan berikut untuk menyiapkan data:
CREATE TABLE t(a int, b int, c int); insert into t select i % 100000, i, i from generate_series(1, 1000000) i; create table t2 as select * from t; create index on t(c); create index on t2(a); ANALYZE t,t2; - Jalankan pernyataan berikut untuk menangkap rencana eksekusi dari kueri sumber SQL1 dan kueri yang ditulis ulang SQL2:
prepare s1 as select t.a, t2.avg_b from t join (select avg(b) as avg_b, a from t2 group by a) t2 on t2.a = t.a and t.c < $1 order by t.a; prepare s2 as select t.a, t2.avg_b from t join lateral (select avg(b) as avg_b from t2 where t2.a = t.a) as t2 on t.c < $1 order by t.a; SELECT polar_outline.polar_outline_create('EXECUTE s1(5)'); polar_outline_create ---------------------- t (1 row) SELECT polar_outline.polar_outline_create('EXECUTE s2(5)'); polar_outline_create ---------------------- t (1 row) - Jalankan pernyataan berikut untuk menggunakan polar_outline_switch menukar rencana eksekusi dari dua kueri:Catatan Parameter input adalah ID dari dua rencana eksekusi dalam outline. Rencana eksekusi SQL1 diganti dengan rencana eksekusi SQL2.
SELECT polar_outline.polar_outline_switch(1,2); polar_outline_switch ---------------------- t (1 row) - Jalankan pernyataan berikut untuk menghapus rencana eksekusi SQL2 dari outline:Catatan Setelah SQL1 ditulis ulang, rencana eksekusi SQL2 tidak diperlukan dan harus dibersihkan.
SELECT polar_outline.polar_outline_delete(2); - Kode berikut menunjukkan hasil eksekusi SQL1 sebelum SQL1 ditulis ulang dan hasil eksekusi SQL1 setelah SQL1 ditulis ulang:
Sebelum SQL1 ditulis ulang, s1 menunjukkan rencana eksekusi asli dari SQL1. EXPLAIN (COSTS FALSE) EXECUTE s1(5); QUERY PLAN ------------------------------------------- Sort Sort Key: t.a -> Hash Join Hash Cond: (t.a = t2.a) -> Index Scan using t_c_idx on t Index Cond: (c < $1) -> Hash -> HashAggregate Group Key: t2.a -> Seq Scan on t2 (10 rows) SELECT polar_outline_switch(1,2); polar_outline_switch ---------------------- t (1 row) Setelah SQL1 ditulis ulang, s1 menunjukkan rencana eksekusi saat ini dari SQL1. Rencana eksekusi saat ini bersumber dari SQL2. EXPLAIN (COSTS FALSE) EXECUTE s1(5); QUERY PLAN ------------------------------------------------------- Sort Sort Key: t.a -> Nested Loop -> Index Scan using t_c_idx on t Index Cond: (c < $1) -> Aggregate -> Bitmap Heap Scan on t2 Recheck Cond: (a = t.a) -> Bitmap Index Scan on t2_a_idx Index Cond: (a = t.a) (10 rows)