Praktik terbaik untuk meningkatkan kepatuhan, stabilitas, dan kinerja instans ApsaraDB RDS for PostgreSQL.
Connection pooling
Konfigurasikan parameter connection pool
Gunakan objek PreparedStatement untuk menyimpan cache pernyataan SQL di connection pool. Pendekatan ini menghindari hard parse, mengurangi penggunaan CPU, dan meningkatkan kinerja instans.
Minimalkan koneksi idle guna mengurangi penggunaan memori, meningkatkan efisiensi GetSnapshotData(), serta meningkatkan kinerja sistem secara keseluruhan.
Aktifkan connection pooling di aplikasi Anda untuk menghindari overhead akibat koneksi berumur pendek. Jika aplikasi Anda tidak mendukung connection pooling bawaan, tempatkan connection pool di antara aplikasi dan instans RDS—misalnya, PgBouncer atau Pgpool-II.
Tetapkan parameter berikut untuk connection pool Anda:
| Parameter | Nilai yang direkomendasikan | Deskripsi |
|---|---|---|
minimumIdle | 1 | Jumlah minimum koneksi idle. Menyetel nilai ini ke 1 mengurangi koneksi idle. |
maxIdle | 1 | Jumlah maksimum koneksi idle. Hanya berlaku jika parameter tersedia—parameter ini telah dihapus dari sebagian besar implementasi connection pool. |
maxLifetime | 60 menit | Waktu hidup (TTL) maksimum per koneksi. Mengurangi error out-of-memory (OOM) yang disebabkan oleh koneksi RelCache yang terlalu sering. |
maximumPoolSize | 15 | Koneksi maksimum per pool. Cocok untuk sebagian besar workload. Tingkatkan nilai ini hanya pada klien database jika instans Anda menangani workload dari lebih banyak koneksi daripada yang dapat dilayani oleh pool. |
Konfigurasi yang direkomendasikan berdasarkan framework
Konfigurasi berikut berlaku untuk framework connection pool paling umum. Konfigurasi ini tidak mencakup pengaturan PreparedStatement—sesuaikan pengaturan tersebut sesuai kebutuhan aplikasi Anda.
HikariCP (direkomendasikan untuk Java):
minimumIdle=1, maximumPoolSize=15, idleTimeout=600000 (10 menit), maxLifetime=3600000 (60 menit)GORM (direkomendasikan untuk Go):
sqlDB.SetMaxIdleConns(1), sqlDB.SetMaxOpenConns(15), sqlDB.SetConnMaxLifetime(time.Hour)Druid (Java):
initialSize=1, minIdle=1, maxIdle=1, maxActive=15, testOnBorrow=false, testOnReturn=false, testWhileIdle=true, minEvictableIdleTimeMillis=600000 (10 menit), maxEvictableIdleTimeMillis=900000 (15 menit), timeBetweenEvictionRunsMillis=60000 (1 menit), maxWait=6000 (6 detik)Kinerja dan stabilitas
Satu database berkorespondensi dengan satu folder di sistem file dasar. Tabel, partisi, dan indeks berkorespondensi dengan file dalam folder tersebut. Jika jumlah file melebihi 20 juta, instans akan melaporkan error disk space exhausted. Pisahkan database atau gabungkan file tabel berdasarkan beban kerja Anda.
Gunakan
CREATE INDEX CONCURRENTLYuntuk membuat indeks pada beban kerja online. Ini menghindari pemblokiran operasi INSERT, UPDATE, dan DELETE pada tabel target di sesi lain.Untuk instans yang menjalankan PostgreSQL 12 atau versi lebih baru, gunakan
REINDEX CONCURRENTLYuntuk membangun ulang indeks. Untuk PostgreSQL 11 atau versi lebih lama, gunakanCREATE INDEX ... CONCURRENTLYuntuk membuat indeks pengganti, lalu hapus indeks aslinya.Hindari pembuatan dan penghapusan temporary table secara berulang—hal ini meningkatkan overhead tabel sistem. Gunakan hati-hati klausa
ON COMMIT DROP. Dalam sebagian besar kasus, gunakan klausaWITHalih-alih temporary table.PostgreSQL 13 meningkatkan dukungan untuk tabel partisi, operasi
HashAggregatepada klausaGROUP BY, dan kueri paralel. Upgrade instans Anda ke PostgreSQL 13 jika memungkinkan. Untuk informasi selengkapnya, lihat Upgrade the major engine version of an ApsaraDB RDS for PostgreSQL instance.Nonaktifkan fitur cursor jika Anda tidak lagi menggunakannya.
Gunakan
TRUNCATEalih-alihDELETEuntuk penghapusan data tingkat tabel—TRUNCATEjauh lebih cepat.Bungkus pernyataan DDL dalam transaksi agar Anda dapat melakukan rollback jika diperlukan. Pertahankan transaksi tetap singkat: transaksi DDL yang panjang akan memblokir operasi baca pada objek yang dikuncinya.
Untuk penulisan data massal, gunakan
COPYatauINSERT INTO table VALUES (),(),...();multi-baris untuk memaksimalkan throughput tulis.
Versi mesin minor
Untuk menggunakan fitur replication slot, perbarui versi mesin minor ke 20201230 atau versi lebih baru. Pembaruan ini mengaktifkan fitur Logical Replication Slot Failover dan memungkinkan Anda mengonfigurasi aturan peringatan untuk metrik Maximum Replication Slot Latency, sehingga mencegah langganan logis tertinggal atau terganggu. Jika langganan logis tertunda atau terganggu, replication slot akan hilang dan catatan write-ahead logging (WAL) akan menumpuk. Untuk informasi selengkapnya, lihat Logical Replication Slot Failover dan Manage the alert rules of an ApsaraDB RDS for PostgreSQL instance.
Untuk menggunakan fitur audit log atau Performance Insight, perbarui versi mesin minor ke 20211031 atau versi lebih baru.
Jika
log_statementdisetel keall, kinerja meningkat sekitar empat kali lipat dalam skenario dengan lebih dari 50 koneksi aktif, serta mencegah lonjakan signifikan pada utilisasi CPU.
Pemantauan Peringatan
Aktifkan Initiative Alert untuk mengaktifkan aturan peringatan default yang disediakan oleh fitur Pemantauan Peringatan. Untuk informasi selengkapnya, lihat Manage the alerts.
Tetapkan ambang batas peringatan penggunaan memori antara 85% hingga 95% berdasarkan karakteristik beban kerja Anda.
Pemecahan masalah
Untuk menemukan pernyataan SQL yang paling intensif sumber daya (Top SQL), lihat Find the most resource-intensive SQL statements (Top SQL).
Untuk mengidentifikasi pernyataan SQL dengan konsumsi sumber daya tertinggi, lihat Locate SQL statements with the highest resource consumption.
Desain
Izin
Ikuti prinsip least privilege (PoLP) dan kelola izin berdasarkan schema atau role. Buat dua role untuk setiap instans: satu dengan izin baca dan tulis, serta satu dengan izin read-only. Untuk informasi selengkapnya, lihat Manage permissions in an ApsaraDB RDS for PostgreSQL instance.
Jika Anda menerapkan read/write splitting di application layer, tetapkan role read-only ke klien database yang hanya membaca.
Tabel
Sesuaikan tipe data dalam schema Anda dengan tipe data di aplikasi, dan terapkan aturan validasi yang konsisten di semua tabel. Hal ini mencegah error ketidaksesuaian tipe dan memastikan indeks digunakan dengan benar.
Untuk tabel yang datanya secara rutin dipurge, partisi berdasarkan tahun atau bulan. Gunakan
DROPatauTRUNCATEpada tabel anak untuk menghapus data—hindari menjalankanDELETEpada tabel anak.Untuk tabel yang sering diperbarui, setel
FILLFACTORke85saat pembuatan. Ini menyisakan 15% ruang penyimpanan per halaman untuk hot update, sehingga mengurangi page split.CREATE TABLE test123(id int, info text) WITH(FILLFACTOR=85);Gunakan konvensi penamaan berikut:
Temporary table: nama dimulai dengan
tmp_Tabel partisi anak: nama diakhiri dengan nilai kunci partisi. Misalnya, jika tabel induk adalah
tbldan dipartisi berdasarkan tahun, tabel anak diberi namatbl_2016,tbl_2017, dan seterusnya.
Indeks
ApsaraDB RDS for PostgreSQL mendukung jenis indeks berikut: B-tree, Hash, GIN, GiST, SP-GiST, BRIN, RUM, Bloom, dan PASE. RUM, Bloom, dan PASE merupakan jenis indeks ekstensi.
Memilih jenis indeks:
B-tree: Jenis indeks default. Total ukuran field tidak boleh melebihi 2.000 byte. Jika total ukuran field yang diindeks melebihi 2.000 byte, buat indeks berbasis fungsi (seperti indeks hash) atau proses data melalui analyzer sebelum diindeks.
BRIN: Gunakan untuk tabel besar di mana nilai kolom memiliki urutan linier alami—misalnya, timestamp, ID auto-increment, atau streaming data. Indeks BRIN ringkas dan mempercepat kueri rentang.
CREATE INDEX idx ON tbl USING BRIN(id);
Hindari full table scan kecuali saat memindai dan menganalisis dataset besar. Sebagian besar tipe data PostgreSQL mendukung indeks.
Konvensi penamaan indeks:
| Jenis indeks | Awalan |
|---|---|
| Indeks primary key | pk_ |
| Indeks unik | uk_ |
| Indeks biasa | idx_ |
Tipe data dan set karakter
Pilih tipe data yang sesuai dengan data yang disimpan. Hindari penggunaan tipe string untuk data numerik atau data yang secara alami cocok dalam struktur pohon—tipe data yang tepat meningkatkan efisiensi kueri.
ApsaraDB RDS for PostgreSQL mendukung berbagai tipe data, termasuk: Numeric, Floating-Point, Monetary, String, Character, Binary, Date/Time, Boolean, Enumerated, Geometry, Network Address, Bit String, Text Search, UUID, XML, JSON, Array, Composite, Range, Object identifier, row number, large object, ltree structure, Data Cube, geography, H-Store, pg_trgm module, PostGIS, dan HyperLogLog. PostGIS mendukung tipe point, line segment, surface, path, latitude, longitude, raster, dan topology. HyperLogLog adalah struktur data berukuran tetap yang mirip himpunan untuk menghitung nilai unik dengan presisi yang dapat disesuaikan.
Setel LC_COLLATE ke C alih-alih UTF8. Aturan pengurutan C lebih unggul dibanding aturan pengurutan UTF8. Jika Anda menggunakan aturan pengurutan UTF8, Anda harus menentukan kelas operator text_pattern_ops pada indeks untuk mendukung kueri LIKE.
Prosedur tersimpan
Untuk logika bisnis kompleks yang melibatkan banyak round trip antara aplikasi dan database, gunakan prosedur tersimpan (seperti prosedur berbasis PL/pgSQL) atau fungsi bawaan untuk mengurangi interaksi aplikasi-database. PostgreSQL mendukung fungsi analitik, fungsi agregat, fungsi jendela, fungsi matematika, dan fungsi geometri.
Kueri data
Gunakan
COUNT(*)alih-alihCOUNT(column_name)atauCOUNT(constants).COUNT(*)adalah standar SQL-92 untuk menghitung baris dan mencakup nilai NULL.COUNT(column_name)mengecualikan nilai NULL dan menghasilkan hasil yang berbeda.Untuk
COUNT(DISTINCT)pada beberapa kolom, masukkan daftar kolom dalam tanda kurung:COUNT( (col1, col2, col3) )COUNT(DISTINCT)mencakup semua nilai NULL, sehingga menghasilkan hasil yang sama denganCOUNT(*).Hindari
SELECT * FROM t. Tentukan hanya kolom yang Anda butuhkan untuk mencegah pengembalian data yang tidak perlu.Hindari mengembalikan result set besar ke klien database, kecuali untuk operasi extract, transform, and load (ETL). Jika suatu kueri mengembalikan result set yang sangat besar, periksa apakah rencana eksekusi kueri tersebut optimal.
Untuk kueri rentang, gunakan tipe data Range dengan indeks GiST untuk meningkatkan kinerja.
Jika aplikasi Anda sering menjalankan kueri yang mengembalikan banyak baris, agregasikan hasil menjadi batch. Misalnya, jika suatu kueri mengembalikan 100 baris, agregasikan menjadi satu result set. Jika aplikasi Anda mengakses hasil berdasarkan ID, agregasikan berdasarkan ID secara berkala. Result set yang lebih kecil mengurangi waktu respons.
Manajemen instans
Aktifkan fitur SQL Explorer dan Audit untuk mengkueri dan mengekspor informasi eksekusi SQL, termasuk database yang dikueri, status eksekusi, dan durasi. Gunakan fitur ini untuk mendiagnosis kesehatan SQL, memecahkan masalah kinerja, dan menganalisis traffic. Untuk informasi selengkapnya, lihat Use the SQL Explorer and Audit feature on an ApsaraDB RDS for PostgreSQL instance.
Untuk memantau dan mencatat aktivitas dalam Akun Alibaba Cloud Anda—termasuk akses konsol, API, dan tool developer—gunakan ActionTrail. ActionTrail mencatat tindakan tersebut sebagai event yang dapat Anda unduh dari Konsol ActionTrail atau kirimkan ke Logstore Layanan Log atau bucket Object Storage Service (OSS) untuk analitik keamanan, pelacakan perubahan sumber daya, atau audit kepatuhan. Untuk informasi selengkapnya, lihat What is ActionTrail?.
Tinjau semua operasi DDL sebelum menjalankannya, dan jadwalkan perubahan DDL selama jam sepi.
Sebelum melakukan commit transaksi yang menghapus atau memodifikasi data, jalankan pernyataan
SELECTuntuk mengonfirmasi baris yang terpengaruh. Jika logika bisnis Anda mengharuskan pembaruan tepat satu baris, tambahkanLIMIT 1.Untuk operasi DDL dan operasi lain yang memperoleh lock—seperti
VACUUM FULLdanCREATE INDEX—tetapkan timeout lock untuk mencegahnya memblokir kueri tanpa batas:BEGIN; SET LOCAL lock_timeout = '10s'; -- DDL statement; END;Gunakan
EXPLAIN ANALYZEuntuk memeriksa rencana eksekusi kueri. Berbeda denganEXPLAIN,EXPLAIN ANALYZEbenar-benar mengeksekusi kueri. Jika rencana tersebut melibatkan operasi DML (UPDATE, INSERT, atau DELETE), bungkus pernyataan dalam transaksi dan lakukan rollback setelah pemeriksaan untuk menghindari perubahan data yang tidak disengaja:BEGIN; EXPLAIN (ANALYZE) <DML (UPDATE/INSERT/DELETE) SQL>; ROLLBACK;Untuk penghapusan atau pembaruan skala besar, proses data dalam batch—setiap batch dalam transaksinya sendiri. Menghapus atau memperbarui semua baris dalam satu transaksi menghasilkan jumlah besar junk data.