Ekstensi hypopg membantu Anda memeriksa apakah suatu jenis indeks dapat mempercepat satu atau lebih kueri.
Prasyarat
Sebelum menggunakan ekstensi hypopg, tentukan hal berikut:
Kueri mana yang perlu dioptimalkan.
Jenis indeks yang akan digunakan.
Ekstensi ini didukung pada kluster PolarDB for PostgreSQL (Kompatibel dengan Oracle) yang menjalankan mesin berikut:
PolarDB for PostgreSQL (Kompatibel dengan Oracle) 2.0 (versi revisi 2.0.14.1.0 atau lebih baru).
PolarDB for PostgreSQL (Kompatibel dengan Oracle) 1.0 (versi revisi 1.1.28 atau lebih baru).
CatatanAnda dapat mengeksekusi salah satu dari pernyataan berikut untuk melihat versi revisi kluster PolarDB for PostgreSQL (Kompatibel dengan Oracle):
SHOW polar_version;
Ikhtisar
hypopg adalah ekstensi pihak ketiga sumber terbuka yang didukung oleh dan PolarDB for PostgreSQL (Kompatibel dengan Oracle). Indeks hipotetis yang dibuat oleh hypopg tidak ada di tabel sistem apa pun, tetapi disimpan dalam memori pribadi yang terhubung. Ekstensi hypopg memastikan bahwa indeks hipotetis digunakan oleh pernyataan EXPLAIN (tidak termasuk opsi ANALYZE) karena indeks tersebut tidak ada secara fisik. Indeks hipotetis tidak benar-benar ada atau mengonsumsi sumber daya seperti CPU dan disk.
Ekstensi hypopg mendukung jenis indeks berikut:
btree: indeks Pohon-B.
brin: indeks rentang blok.
hash: indeks hash.
bloom: indeks bloom. Anda harus menginstal ekstensi bloom terlebih dahulu.
Penggunaan
Instal ekstensi hypopg.
Instal ekstensi hypopg.
CREATE EXTENSION hypopg;Periksa apakah ekstensi hypopg telah diinstal.
\dx hypopgHasil contoh:
Daftar ekstensi yang diinstal Nama | Versi | Skema | Deskripsi --------+---------+--------+------------------------------------- hypopg | 1.3.1 | public | Indeks hipotetis untuk PostgreSQL (1 baris)CatatanHasil sebelumnya menunjukkan bahwa hypopg 1.3.1 telah diinstal.
Anda juga dapat mengeksekusi pernyataan SQL untuk menanyakan tabel pg_extension guna memeriksa apakah ekstensi hypopg telah diinstal. Contoh:
SELECT * FROM pg_extension WHERE extname = 'hypopg';Hasil contoh:
extname | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition ---------+----------+--------------+----------------+------------+-----------+-------------- hypopg | 10 | 2200 | t | 1.3.1 | | (1 baris)
Konfigurasikan parameter.
Parameter
Deskripsi
hypopg.enabled
Menentukan apakah akan mengaktifkan ekstensi hypopg. Nilai default: on. Nilai valid:
on
off
CatatanKetika ekstensi hypopg dinonaktifkan, indeks hipotetis tidak digunakan, tetapi indeks hipotetis yang ada tidak dihapus.
hypopg.use_real_oids
Menentukan apakah akan menggunakan pengenal objek (OID) nyata. Nilai default: off. Nilai valid:
off: tidak menggunakan OID nyata. Sebagai gantinya, ID dipilih dari rentang ID yang tidak digunakan. ID tersebut dicadangkan oleh database untuk digunakan di rilis mendatang. Ini tidak menciptakan masalah apa pun karena rentang ID yang tidak digunakan dihitung secara dinamis saat ekstensi hypopg pertama kali digunakan, dan dapat digunakan di server sekunder.
CatatanNamun, ketika parameter ini diatur ke off, sekitar 2500 indeks hipotetis dapat ada secara total. Ketika jumlah maksimum tercapai, akan membutuhkan waktu sangat lama untuk membuat indeks hipotetis baru. Dalam hal ini, Anda harus memanggil fungsi
hypopg_reset()untuk menyelesaikan masalah ini. Untuk informasi lebih lanjut, lihat Operasi indeks hipotetis.on: menggunakan OID nyata. Parameter hypopg.use_real_oids digunakan untuk mencegah masalah di mana diperlukan waktu sangat lama untuk membuat indeks hipotetis baru ketika jumlah maksimum indeks hipotetis tercapai. hypopg meminta OID nyata. Ini memerlukan lebih banyak sumber daya kunci dan OID nyata tidak dapat digunakan di server sekunder. Namun, semua OID dapat digunakan. Untuk informasi lebih lanjut, lihat Operasi indeks hipotetis.
CatatanMengubah status parameter ini tidak mereset OID indeks hipotetis. OID nyata dan non-nyata dapat berkoeksistensi.
Hapus ekstensi hypopg.
DROP EXTENSION hypopg;
Untuk informasi lebih lanjut, lihat Operasi indeks hipotetis.
Contoh
Buat tabel dan sisipkan beberapa data. Tabel tidak memiliki indeks. Contoh:
CREATE TABLE hypo (id integer, val text); INSERT INTO hypo SELECT i, 'line ' || i FROM generate_series(1, 100000) i; VACUUM ANALYZE hypo;Periksa apakah kueri dipercepat. Contoh:
EXPLAIN SELECT val FROM hypo WHERE id = 1;Hasil contoh:
RENCANA KUERI -------------------------------------------------------- Seq Scan on hypo (biaya=0.00..1791.00 baris=1 lebar=10) Filter: (id = 1) (2 baris)CatatanPemindaian berurutan digunakan dalam kueri sederhana karena tabel hypo tidak memiliki indeks.
Buat indeks hipotetis pada tabel. Contoh:
SELECT * FROM hypopg_create_index('CREATE INDEX ON hypo (id)') ;Hasil contoh:
indexrelid | indexname ------------+---------------------- 13925 | <13925>btree_hypo_id (1 baris)Tabel berikut menjelaskan parameter.
Parameter
Deskripsi
13925
OID indeks hipotetis.
<13925>btree_hypo_id
Nama indeks hipotetis.
CatatanIndeks B-tree sederhana pada kolom id mempercepat kueri ini.
Fungsi
hypopg_create_index()menerima pernyataanCREATE INDEXstandar apa pun (pernyataan lain yang dilewatkan ke fungsi diabaikan) dan membuat indeks hipotetis untuk setiap pernyataan.OID dihasilkan secara dinamis. Dalam contoh ini, nilainya adalah 13925.
Eksekusi pernyataan EXPLAIN untuk memeriksa apakah database menggunakan indeks. Contoh:
EXPLAIN SELECT val FROM hypo WHERE id = 1;Hasil contoh:
RENCANA KUERI ------------------------------------------------------------------------------------ Index Scan using "<13925>btree_hypo_id" on hypo (biaya=0.04..8.06 baris=1 lebar=10) Kondisi Indeks: (id = 1) (2 baris)CatatanDatabase menggunakan indeks.
Eksekusi pernyataan EXPLAIN untuk memeriksa apakah database menggunakan indeks hipotetis saat pernyataan dieksekusi. Contoh:
EXPLAIN ANALYZE SELECT val FROM hypo WHERE id = 1;Hasil contoh:
RENCANA KUERI --------------------------------------------------------------------------------------------------- Seq Scan on hypo (biaya=0.00..1791.00 baris=1 lebar=10) (aktual waktu=0.030..15.439 baris=1 loop=1) Filter: (id = 1) Baris Dihapus oleh Filter: 99999 Waktu Perencanaan: 0.066 ms Waktu Eksekusi: 15.492 ms (5 baris)CatatanPeriksa apakah database menggunakan indeks hipotetis saat pernyataan dieksekusi.
Operasi indeks hipotetis
Ekstensi hypopg menyediakan fitur dan tampilan yang berguna.
Tampilan hypopg_list_indexes: mencantumkan semua indeks hipotetis yang ada. Contoh:
SELECT * FROM hypopg_list_indexes ;Hasil contoh:
indexrelid | index_name | schema_name | table_name | am_name ------------+----------------------+-------------+------------+--------- 13925 | <13925>btree_hypo_id | public | hypo | btree (1 baris)Fungsi hypopg(): mencantumkan semua indeks hipotetis yang ada dalam format yang sama dengan pg_index. Contoh:
SELECT * FROM hypopg() ;Hasil contoh:
indexname | indexrelid | indrelid | innatts | indisunique | indkey | indcollation | indclass | indoption | indexprs | indpred | amid ----------------------+------------+----------+---------+-------------+--------+--------------+----------+-----------+----------+---------+------ <13925>btree_hypo_id | 13925 | 16450 | 1 | f | 1 | 0 | 1978 | | | | 403 (1 baris)Fungsi hypopg_get_indexdef(oid): memperoleh pernyataan CREATE INDEX aktual menggunakan OID indeks hipotetis. Contoh:
SELECT index_name, hypopg_get_indexdef(indexrelid) FROM hypopg_list_indexes ;Hasil contoh:
index_name | hypopg_get_indexdef ----------------------+---------------------------------------------- <13925>btree_hypo_id | CREATE INDEX ON public.hypo USING btree (id) (1 baris)Fungsi hypopg_relation_size(oid): memperkirakan ukuran indeks hipotetis. Contoh:
SELECT index_name, pg_size_pretty(hypopg_relation_size(indexrelid)) FROM hypopg_list_indexes ;Hasil contoh:
index_name | pg_size_pretty ----------------------+---------------- <13925>btree_hypo_id | 2544 kB (1 baris)Fungsi hypopg_drop_index(oid): menghapus indeks hipotetis dengan OID tertentu. Contoh:
SELECT hypopg_drop_index(13925);Hasil contoh:
hypopg_drop_index ------------------- t (1 baris)Fungsi hypopg_reset(): menghapus semua indeks hipotetis. Contoh:
SELECT hypopg_reset();Hasil contoh:
hypopg_reset -------------- (1 baris)