Pembuatan indeks B-tree pada tabel besar dapat memakan waktu signifikan, mengganggu jendela pemeliharaan dan memperlambat migrasi skema. Elastic Parallel Query (EPQ) memparalelkan pemindaian heap table selama pembuatan indeks, sehingga mengurangi waktu pembuatan menjadi sekitar seperlima dibandingkan metode serial native.
Cara kerja
Tanpa EPQ, PolarDB for PostgreSQL (Compatible with Oracle) melakukan pemindaian heap table secara berurutan untuk membuat entri indeks, lalu membangun B-tree dari entri tersebut.
Dengan EPQ diaktifkan, proses query coordinator (QC) mendistribusikan pemindaian heap ke beberapa Parallel Worker. Setiap worker memindai satu partisi tabel dan meneruskan hasilnya ke proses pembuatan indeks, yang kemudian menyusun B-tree akhir.
Batasan
| Batasan | Detail |
|---|---|
| Tipe kolom | EPQ hanya mempercepat pembuatan indeks pada kolom umum. Kolom ekspresi tidak didukung. |
| Sintaksis | Opsi CONCURRENTLY dan INCLUDE tidak didukung dengan EPQ. |
Parameter
Konfigurasikan parameter berikut sebelum membuat indeks dengan EPQ.
| Parameter | Default | Disarankan | Deskripsi |
|---|---|---|---|
polar_px_enable_btbuild | off | on | Mengaktifkan pembuatan indeks yang dipercepat oleh EPQ. |
polar_px_dop_per_node | 1 | 8 atau 16 | Degree of parallelism (DOP) per node. Juga mengontrol DOP untuk . |
polar_px_enable_replay_wait | (auto) | — | Diaktifkan secara otomatis untuk session saat ini ketika polar_px_enable_btbuild=on. Memastikan entri tabel terbaru diindeks. Nilai parameter ini dikembalikan ke default database setelah pembuatan indeks selesai. |
polar_bt_write_page_buffer_size | 0 | 4096 | Mengontrol perilaku write I/O selama pembuatan indeks. Satuan: blok. Maksimum: 8192. Mengatur nilai ini menjadi 4096 dapat mengurangi waktu pembuatan indeks hingga 20%. |
Perilaku polar_bt_write_page_buffer_size
`0` (default): Menyimpan entri indeks ke disk blok per blok saat setiap halaman indeks penuh.
Nilai bukan nol: Menyimpan entri indeks dalam buffer kernel dengan ukuran yang ditentukan dan menyimpan semuanya sekaligus saat buffer penuh, sehingga mengurangi overhead penjadwalan I/O yang sering terjadi.
Buat indeks B-tree dengan EPQ
Prasyarat
Sebelum memulai, pastikan Anda memiliki:
Kluster PolarDB for PostgreSQL (Compatible with Oracle)
Akses untuk menjalankan pernyataan DDL pada tabel target
Prosedur
Contoh berikut membuat tabel bernama test dan membangun indeks menggunakan EPQ.
1. Buat tabel uji coba.
CREATE TABLE test(id int, id2 int);Verifikasi skema tabel:
\d testOutput yang diharapkan:
Table "public.test"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
id | integer | | |
id2 | integer | | |2. Aktifkan pembuatan indeks EPQ yang dipercepat.
SET polar_px_enable_btbuild=on;Verifikasi pengaturan:
SHOW polar_px_enable_btbuild;Output yang diharapkan:
polar_px_enable_btbuild
-------------------------
on
(1 row)3. Buat indeks.
Tambahkan WITH (px_build=on) ke pernyataan CREATE INDEX untuk menggunakan EPQ dalam pembuatan ini:
CREATE INDEX t ON test(id) WITH(px_build=on);polar_px_enable_btbuild=onsaja tidak mengaktifkan EPQ untuk pembuatan indeks tertentu. Anda harus menyertakanWITH (px_build=on)dalam pernyataanCREATE INDEX. Tanpa itu, PolarDB menggunakan metode pembuatan indeks native (serial), dan indeks yang dihasilkan tidak menampilkan anotasipx_build.
4. Verifikasi bahwa indeks dibuat dengan EPQ.
\d testOutput yang diharapkan:
Table "public.test"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
id | integer | | |
id2 | integer | | |
Indexes:
"t" btree (id) WITH (px_build=finish)Bidang (px_build=finish) mengonfirmasi bahwa EPQ digunakan.
Data kinerja
EPQ membuat indeks untuk tabel besar sekitar lima kali lebih cepat dibandingkan metode native.
Gambar berikut membandingkan kinerja pembuatan indeks global sebelum dan sesudah mengaktifkan EPQ, menggunakan data sebesar 130 GB.
