Plugin pg_concurrency_control untuk ApsaraDB RDS for PostgreSQL memungkinkan Anda membatasi jumlah pernyataan SQL konkuren berdasarkan jenisnya—kueri SELECT, pernyataan DML, kueri lambat, dan blok transaksi. Ketika suatu pernyataan mencapai batas yang dikonfigurasi, pernyataan tersebut akan menunggu dalam antrian alih-alih langsung dieksekusi, sehingga mencegah kehabisan sumber daya di bawah beban kerja dengan tingkat konkurensi tinggi.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Instans ApsaraDB RDS for PostgreSQL yang menjalankan PostgreSQL 10 atau 11
Untuk memeriksa versi instans Anda, jalankan SELECT version(); di database Anda.
Instal plugin
Jalankan perintah berikut untuk membuat ekstensi:
CREATE EXTENSION pg_concurrency_control;Konfigurasikan batas konkurensi
Setiap parameter konkurensi memiliki nilai default 0, yang menonaktifkan kontrol konkurensi untuk jenis pernyataan tersebut. Atur parameter ke bilangan bulat positif untuk mengaktifkan batas tersebut.
Sebagai contoh, atur pg_concurrency_control.query_concurrency ke 10 untuk mengaktifkan kontrol konkurensi pada pernyataan SELECT. Gunakan pendekatan yang sama untuk jenis pernyataan lainnya.
Untuk menandai suatu pernyataan sebagai kueri lambat agar tunduk pada batas bigquery_concurrency, tambahkan petunjuk /*+bigsql*/ di awal pernyataan:
/*+bigsql*/ SELECT * FROM test;Referensi parameter
Parameter konkurensi
| Parameter | Default | Nilai valid | Deskripsi |
|---|---|---|---|
pg_concurrency_control.query_concurrency | 0 | 0–1024 | Jumlah maksimum pekerjaan konkuren untuk pernyataan SELECT. Nilai 0 menonaktifkan kontrol. |
pg_concurrency_control.bigquery_concurrency | 0 | 0–1024 | Jumlah maksimum pekerjaan konkuren untuk kueri lambat. Nilai 0 menonaktifkan kontrol. Tandai suatu pernyataan sebagai kueri lambat menggunakan petunjuk /*+bigsql*/. |
pg_concurrency_control.transaction_concurrency | 0 | 0–1024 | Jumlah maksimum pekerjaan konkuren untuk blok transaksi. Nilai 0 menonaktifkan kontrol. |
pg_concurrency_control.autocommit_concurrency | 0 | 0–1024 | Jumlah maksimum pekerjaan konkuren untuk pernyataan DML. Nilai 0 menonaktifkan kontrol. |
Parameter timeout
| Parameter | Default | Nilai valid | Deskripsi |
|---|---|---|---|
pg_concurrency_control.control_timeout | 1s | 30ms–3s | Waktu maksimum yang dihabiskan oleh pernyataan SELECT, pernyataan DML, atau blok transaksi dalam antrian sebelum aksi timeout dijalankan. |
pg_concurrency_control.bigsql_control_timeout | 1s | 30ms–3s | Waktu maksimum yang dihabiskan oleh kueri lambat dalam antrian sebelum aksi timeout dijalankan. |
pg_concurrency_control.timeout_action | TCC_break | TCC_break, TCC_rollback, TCC_wait | Aksi yang diambil ketika pernyataan SELECT, pernyataan DML, atau blok transaksi mengalami timeout saat menunggu dalam antrian. Lihat Nilai aksi timeout. |
pg_concurrency_control.bigsql_timeout_action | TCC_wait | TCC_break, TCC_rollback, TCC_wait | Aksi yang diambil ketika kueri lambat mengalami timeout saat menunggu dalam antrian. Lihat Nilai aksi timeout. |
Nilai aksi timeout
| Nilai | Perilaku |
|---|---|
TCC_break | Melewatkan pernyataan yang sedang menunggu dan mengeksekusi pernyataan berikutnya. |
TCC_rollback | Melaporkan error dan melakukan rollback transaksi. |
TCC_wait | Mengatur ulang timestamp setelah timeout dan terus menunggu. |
Verifikasi status antrian
Gunakan pg_concurrency_control_status() untuk memeriksa antrian pernyataan saat ini. Fungsi ini mengembalikan jumlah pernyataan yang sedang menunggu di setiap antrian.
SELECT * FROM pg_concurrency_control_status();Output saat tidak ada pernyataan dalam antrian:
autocommit_count | bigquery_count | query_count | transaction_count
------------------+----------------+-------------+-------------------
0 | 0 | 0 | 0
(1 row)Angka hitungan bukan nol menegaskan bahwa batas aktif dan pernyataan sedang diantrikan. Setelah pernyataan dalam antrian selesai atau mengalami timeout, angka tersebut akan berkurang secara otomatis.
Contoh: verifikasi bahwa batas kueri lambat aktif
Contoh berikut menunjukkan status antrian saat kueri lambat dijalankan dengan batas bigquery_concurrency.
Periksa antrian sebelum menjalankan kueri apa pun:
SELECT * FROM pg_concurrency_control_status();autocommit_count | bigquery_count | query_count | transaction_count ------------------+----------------+-------------+------------------- 0 | 0 | 0 | 0 (1 row)Atur
pg_concurrency_control.query_concurrencyke10untuk mengaktifkan kontrol konkurensi SELECT.Jalankan kueri lambat menggunakan petunjuk
/*+bigsql*/:/*+ bigsql */ SELECT pg_sleep(10);Saat kueri lambat sedang berjalan, periksa antrian dari sesi kedua:
SELECT * FROM pg_concurrency_control_status();autocommit_count | bigquery_count | query_count | transaction_count ------------------+----------------+-------------+------------------- 0 | 1 | 0 | 0 (1 row)Nilai
bigquery_countsebesar1menegaskan bahwa kueri lambat tersebut sedang dilacak dalam antrian. Setelah kueri selesai, angka tersebut akan otomatis kembali ke nol.