Topik ini menjelaskan cara menggunakan ekstensi index_adviser pada instans ApsaraDB RDS for PostgreSQL. Ekstensi ini membantu menentukan kolom yang memerlukan pembuatan indeks untuk meningkatkan kinerja kueri beban kerja tertentu. Ekstensi ini hanya mendukung pengenalan indeks B-tree satu kolom atau komposit dan tidak dapat mengenali jenis indeks lain seperti GIN, GiST, atau Hash.
Prasyarat
Instans RDS harus menjalankan versi mesin minor 20230830 atau yang lebih baru.
Komponen dari ekstensi index_adviser
Saat Anda mengeksekusi pernyataan untuk membuat ekstensi index_adviser, tabel index_advisory, fungsi show_index_advisory(), dan tampilan select_index_advisory akan dibuat.
Komponen | Deskripsi |
index_advisory | Tabel yang dibuat saat ekstensi index_adviser dibuat. Tabel ini digunakan untuk mencatat saran pengindeksan. |
show_index_advisory() | Fungsi PL/pgSQL yang menafsirkan dan menampilkan saran yang dibuat selama sesi tertentu. Sesi diidentifikasi oleh ID proses backend-nya. |
select_index_advisory | Tampilan yang dibuat oleh ekstensi index_adviser berdasarkan informasi yang disimpan dalam tabel index_advisory selama analisis kueri. Format tampilan sama dengan format keluaran fungsi show_index_advisory(). Tampilan berisi semua saran pengindeksan untuk sesi yang ditentukan. |
Gunakan ekstensi
Buat ekstensi index_adviser.
postgres=# create extension index_adviser; CREATE EXTENSIONMuat ekstensi index_adviser.
postgres=# LOAD 'index_adviser'; LOADCatatanPernyataan sebelumnya hanya berlaku untuk sesi saat ini. Untuk memuat ekstensi index_adviser secara default di semua sesi, konfigurasikan ulang parameter shared_preload_libraries dan mulai ulang instans RDS. Namun, ini dapat mempengaruhi kinerja instans RDS.
shared_preload_libraries='index_adviser'
Contoh
Buat sebuah tabel.
CREATE TABLE t( a INT, b INT ); INSERT INTO t SELECT s, 99999 - s FROM generate_series(0,99999) AS s; ANALYZE t; Tabel berisi baris-baris berikut: a | b -------+------- 0 | 99999 1 | 99998 2 | 99997 3 | 99996 . . . 99997 | 2 99998 | 1 99999 | 0Kueri saran pengindeksan untuk satu Pernyataan SQL tunggal.
Untuk menganalisis kueri dan mendapatkan saran pengindeksan tanpa mengeksekusi kueri, gunakan kata kunci EXPLAIN sebagai awalan dari Pernyataan SQL. Contoh:
postgres=# EXPLAIN SELECT * FROM t WHERE a < 10000; QUERY PLAN --------------------------------------------------------------------------------- Seq Scan on t (cost=0.00..1693.00 rows=9983 width=8) Filter: (a < 10000) Result (cost=0.00..0.00 rows=0 width=0) One-Time Filter: '** plan (using Index Adviser) **'::text -> Index Scan using "<1>t_a_idx" on t (cost=0.42..256.52 rows=9983 width=8) Index Cond: (a < 10000) (6 rows)postgres=# EXPLAIN SELECT * FROM t WHERE a = 100; QUERY PLAN ---------------------------------------------------------------------------- Seq Scan on t (cost=0.00..1693.00 rows=1 width=8) Filter: (a = 100) Result (cost=0.00..0.00 rows=0 width=0) One-Time Filter: '** plan (using Index Adviser) **'::text -> Index Scan using "<1>t_a_idx" on t (cost=0.42..2.64 rows=1 width=8) Index Cond: (a = 100) (6 rows)postgres=# EXPLAIN SELECT * FROM t WHERE b = 10000; QUERY PLAN ---------------------------------------------------------------------------- Seq Scan on t (cost=0.00..1693.00 rows=1 width=8) Filter: (b = 10000) Result (cost=0.00..0.00 rows=0 width=0) One-Time Filter: '** plan (using Index Adviser) **'::text -> Index Scan using "<1>t_b_idx" on t (cost=0.42..2.64 rows=1 width=8) Index Cond: (b = 10000) (6 rows)Gunakan CLI PostgreSQL untuk menanyakan saran pengindeksan dari tabel index_advisory. Contoh:
postgres=# SELECT * FROM index_advisory; reloid | relname | attrs | benefit | original_cost | new_cost | index_size | backend_pid | timestamp --------+---------+-------+---------+---------------+----------+------------+-------------+---------------------------------- 16438 | t | {1} | 1337.43 | 1693 | 355.575 | 2624 | 79370 | 18-JUN-21 08:55:51.492388 +00:00 16438 | t | {1} | 1684.56 | 1693 | 8.435 | 2624 | 79370 | 18-JUN-21 08:59:00.319336 +00:00 16438 | t | {2} | 1684.56 | 1693 | 8.435 | 2624 | 79370 | 18-JUN-21 08:59:07.814453 +00:00 (3 rows)Bidang
Tipe
Deskripsi
reloid
oid
OID dari tabel untuk indeks.
relname
name
Nama tabel untuk indeks.
attrs
integer[]
Kolom tempat saran pengindeksan dihasilkan. Kolom diidentifikasi oleh ID.
benefit
real
Manfaat menggunakan indeks untuk mempercepat kueri.
original_cost
real
Rata-rata waktu yang diperlukan untuk mengeksekusi Pernyataan SQL sebelum Anda menggunakan indeks untuk mempercepat kueri.
new_cost
real
Rata-rata waktu yang diperlukan untuk mengeksekusi Pernyataan SQL setelah Anda menggunakan indeks untuk mempercepat kueri.
index_size
integer
Perkiraan ukuran indeks di halaman disk.
backend_pid
integer
ID proses yang menghasilkan saran ini.
timestamp
timestamp
Tanggal dan waktu ketika saran ini dihasilkan.
Jika Pernyataan SQL tidak diawali dengan kata kunci EXPLAIN, ekstensi index_adviser menganalisis Pernyataan SQL saat kueri dieksekusi dan mencatat saran pengindeksan.
CatatanJangan gunakan ekstensi index_adviser dalam transaksi read-only.
Kueri saran pengindeksan untuk beban kerja tertentu.
Dapatkan saran pengindeksan untuk sesi menggunakan fungsi show_index_advisory().
Fungsi ini digunakan untuk mendapatkan saran pengindeksan untuk sesi. Sesi diidentifikasi oleh ID proses backend-nya. Anda dapat memanggil fungsi ini dengan menentukan ID proses sesi.
SELECT show_index_advisory( pid );CatatanParameter pid menunjukkan ID proses sesi saat ini. Anda dapat memperoleh ID proses menggunakan parameter backend_pid dalam tabel index_advisory. Anda juga dapat menentukan nilai null untuk mengembalikan set hasil untuk sesi saat ini.
postgres=# SELECT show_index_advisory(null); show_index_advisory ---------------------------------------------------------------------------------------------------------------------------------------------------- create index idx_t_a on public.t(a);/* size: 2624 KB, benefit: 3021.99, gain: 1.15167301457103, original_cost: 1693, new_cost: 182.005006313324 */ create index idx_t_b on public.t(b);/* size: 2624 KB, benefit: 1684.56, gain: 0.641983590474943, original_cost: 1693, new_cost: 8.4350004196167 */ (2 rows)CatatanBerikut adalah deskripsi setiap baris dalam set hasil:
Pernyataan SQL untuk membuat indeks dari saran pengindeksan.
Perkiraan ukuran halaman indeks.
Manfaat menggunakan indeks untuk mempercepat kueri.
Keuntungan menggunakan indeks. Rumus berikut digunakan untuk menghitung keuntungan indeks: Keuntungan menggunakan indeks = Manfaat menggunakan indeks / Ukuran yang dikonsumsi oleh indeks.
Rata-rata waktu eksekusi Pernyataan SQL sebelum menggunakan indeks untuk mempercepat kueri.
Rata-rata waktu eksekusi Pernyataan SQL setelah menggunakan indeks untuk mempercepat kueri.
Dapatkan saran pengindeksan untuk sesi menggunakan tampilan select_index_advisory.
Tampilan ini berisi metrik yang dihitung dan CREATE INDEX pernyataan serta memberikan saran pengindeksan untuk semua sesi dalam tabel index_advisory. Contoh berikut menunjukkan saran pengindeksan untuk Kolom a dan Kolom b dari Tabel t:
postgres=# SELECT * FROM select_index_advisory; backend_pid | show_index_advisory -------------+---------------------------------------------------------------------------------------------------------------------------------------------------- 79370 | create index t_a_idx on public.t(a);/* size: 2624 KB, benefit: 3021.99, gain: 1.15167301457103, original_cost: 1693, new_cost: 182.005006313324 */ 79370 | create index t_b_idx on public.t(b);/* size: 2624 KB, benefit: 1684.56, gain: 0.641983590474943, original_cost: 1693, new_cost: 8.4350004196167 */ (2 rows)Dalam setiap sesi, hasil semua kueri yang mendapat manfaat dari saran pengindeksan yang sama digabungkan menjadi satu set metrik. Metrik direpresentasikan oleh bidang bernama benefit dan gain. Rumus berikut menunjukkan cara menghitung nilai kedua bidang tersebut:
size = MAX(index size of all queries) benefit = SUM(benefit of each query) gain = SUM(benefit of each query) / MAX(index size of all queries)CatatanJika saran pengindeksan merekomendasikan pembuatan beberapa indeks untuk satu Pernyataan SQL, bidang new_cost dari tabel index_advisory mencatat biaya setelah beberapa indeks dibuat.
Bidang gain berguna untuk membandingkan keuntungan antara indeks yang direkomendasikan selama sesi tertentu. Nilai yang lebih besar dari bidang gain menunjukkan manfaat yang lebih tinggi dari indeks yang direkomendasikan, yang dapat mengimbangi ruang disk yang mungkin dikonsumsi oleh indeks tersebut.