All Products
Search
Document Center

ApsaraDB RDS:Rekomendasi pengembangan dan operasi

Last Updated:Mar 28, 2026

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:

ParameterNilai yang direkomendasikanDeskripsi
minimumIdle1Jumlah minimum koneksi idle. Menyetel nilai ini ke 1 mengurangi koneksi idle.
maxIdle1Jumlah maksimum koneksi idle. Hanya berlaku jika parameter tersedia—parameter ini telah dihapus dari sebagian besar implementasi connection pool.
maxLifetime60 menitWaktu hidup (TTL) maksimum per koneksi. Mengurangi error out-of-memory (OOM) yang disebabkan oleh koneksi RelCache yang terlalu sering.
maximumPoolSize15Koneksi 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 CONCURRENTLY untuk 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 CONCURRENTLY untuk membangun ulang indeks. Untuk PostgreSQL 11 atau versi lebih lama, gunakan CREATE INDEX ... CONCURRENTLY untuk 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 klausa WITH alih-alih temporary table.

  • PostgreSQL 13 meningkatkan dukungan untuk tabel partisi, operasi HashAggregate pada klausa GROUP 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 TRUNCATE alih-alih DELETE untuk penghapusan data tingkat tabel—TRUNCATE jauh 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 COPY atau INSERT 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_statement disetel ke all, 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 DROP atau TRUNCATE pada tabel anak untuk menghapus data—hindari menjalankan DELETE pada tabel anak.

  • Untuk tabel yang sering diperbarui, setel FILLFACTOR ke 85 saat 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 tbl dan dipartisi berdasarkan tahun, tabel anak diberi nama tbl_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 indeksAwalan
Indeks primary keypk_
Indeks unikuk_
Indeks biasaidx_

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-alih COUNT(column_name) atau COUNT(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 dengan COUNT(*).

  • 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 SELECT untuk mengonfirmasi baris yang terpengaruh. Jika logika bisnis Anda mengharuskan pembaruan tepat satu baris, tambahkan LIMIT 1.

  • Untuk operasi DDL dan operasi lain yang memperoleh lock—seperti VACUUM FULL dan CREATE INDEX—tetapkan timeout lock untuk mencegahnya memblokir kueri tanpa batas:

    BEGIN;
    SET LOCAL lock_timeout = '10s';
    -- DDL statement;
    END;
  • Gunakan EXPLAIN ANALYZE untuk memeriksa rencana eksekusi kueri. Berbeda dengan EXPLAIN, EXPLAIN ANALYZE benar-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.