全部产品
Search
文档中心

ApsaraDB RDS:Gunakan ekstensi pg_squeeze untuk memperkecil tabel dan indeks yang membengkak

更新时间:Jul 02, 2025

ApsaraDB RDS for PostgreSQL mendukung ekstensi pg_squeeze. Ekstensi ini mengatur ulang dan membersihkan data dalam tabel tanpa memengaruhi operasi baca dan tulis online pada instance ApsaraDB RDS for PostgreSQL Anda, mengurangi ruang disk yang digunakan oleh tabel dan indeks serta meningkatkan efisiensi penggunaan ruang.

Prasyarat

  • Parameter berikut telah dikonfigurasi. Untuk informasi lebih lanjut, lihat Modifikasi parameter instance ApsaraDB RDS for PostgreSQL.

    • Parameter wal_level diatur ke logical.

    • pg_squeeze ditambahkan ke nilai parameter shared_preload_libraries agar ekstensi dapat dimuat sebelumnya.

  • Ruang disk mencukupi. Ruang tambahan diperlukan saat ekstensi pg_squeeze memperkecil tabel dan indeks yang membengkak.

    Saat memperkecil tabel penuh, ruang disk yang tersedia harus minimal dua kali dari total ukuran tabel dan indeksnya. Sebagai contoh, jika total ukuran tabel dan indeks adalah 1 GB, diperlukan ruang tambahan sebesar 2 GB.

  • Instance RDS Anda menjalankan versi mesin minor 20240229 atau lebih baru. Jika instance RDS Anda menggunakan PostgreSQL 17, versi mesin minor harus 20241030 atau lebih baru. Untuk informasi lebih lanjut tentang cara melihat dan memperbarui versi mesin minor instance RDS, lihat Perbarui versi mesin minor.

Informasi latar belakang

PostgreSQL menggunakan Kontrol Konkurensi Multi-Versi (MVCC) untuk memungkinkan beberapa transaksi mengakses data yang sama secara bersamaan tanpa konflik. MVCC tidak langsung menimpa atau menghapus data asli saat data diperbarui atau dihapus, tetapi menandainya sebagai tuple mati. Tuple mati tidak terlihat oleh transaksi baru, namun tetap menempati ruang disk, sehingga menyebabkan pembengkakan tabel.

Anda dapat membersihkan tuple mati dengan metode seperti autovacuum. Namun, metode ini tidak sepenuhnya menghilangkan pembengkakan tabel karena ruang yang sebelumnya ditempati oleh tuple mati tidak segera direklamasi. Hal ini juga menyebabkan pembengkakan tabel ketika jumlah ruang yang tidak digunakan cukup signifikan. PostgreSQL menyediakan pernyataan VACUUM FULL untuk mereklamasi ruang yang tidak digunakan. Namun, pernyataan VACUUM FULL memerlukan Access Exclusive Lock, kunci paling restriktif di PostgreSQL, sehingga tabel menjadi tidak dapat diakses selama proses vacuuming.

Deskripsi fitur

Ekstensi pg_squeeze membangun ulang tabel dengan membuat salinan baru dari tabel asli, yang menghilangkan tuple mati. Ini mereklamasi ruang disk yang tidak digunakan dari tabel dan memberikan manfaat berikut:

  • Tabel dapat dibersihkan secara online tanpa memblokir operasi baca dan tulis.

  • Pernyataan SQL dapat dieksekusi langsung tanpa memerlukan klien tambahan.

Skenario

Tabel yang datanya sering diperbarui atau dihapus memiliki laju pembengkakan tabel yang lebih tinggi.

Anda dapat menggunakan pernyataan SQL berikut untuk memperkirakan laju pembengkakan tabel:

CREATE EXTENSION pgstattuple; --buat ekstensi
select *, 1.0 - tuple_len::numeric / table_len as bloat from pgstattuple('your_relation');
Catatan
  • Laju pembengkakan tabel adalah rasio ruang yang tidak digunakan terhadap ruang total dalam tabel, dihitung menggunakan rumus berikut: 1 - Ruang tuple hidup/Ruang total tabel.

  • Eksekusi pernyataan di atas memicu pemindaian tabel penuh.

Catatan penggunaan

  • Tabel yang ingin dibersihkan harus memiliki kunci unik.

  • Proses pembersihan mengonsumsi banyak sumber daya I/O. Disarankan untuk membersihkan tabel selama jam-jam sepi.

Buat atau hapus ekstensi

  • Eksekusi pernyataan berikut untuk membuat ekstensi:

    CREATE EXTENSION pg_squeeze;
    Catatan

    Jika Anda ingin membersihkan tabel di beberapa database, Anda harus membuat ekstensi di setiap database.

  • Eksekusi pernyataan berikut untuk menghapus ekstensi:

    DROP EXTENSION pg_squeeze;

Contoh

Sebelum membersihkan tabel, buat ekstensi di database tujuan.

Bersihkan tabel secara sementara

Dalam contoh berikut, tabel bar di skema public dibersihkan.

SELECT squeeze.squeeze_table('public', 'bar');

Deteksi dan bersihkan tabel secara otomatis

  1. Buat tugas pembersihan otomatis.

    Dalam contoh berikut, ekstensi dikonfigurasi untuk membersihkan tabel foo di skema public pada pukul 22:30 setiap hari Rabu dan Jumat.

    Catatan
    • Untuk informasi lebih lanjut tentang sintaks yang digunakan untuk membuat tugas pembersihan otomatis, lihat pg_squeeze.

    • Hanya tabel di database saat ini yang dapat dibersihkan.

    INSERT INTO squeeze.tables (tabschema, tabname, schedule)
    VALUES ('public', 'foo', ('{30}', '{22}', NULL, NULL, '{3, 5}'));
  2. Aktifkan tugas pembersihan otomatis.

    • Aktifkan tugas pembersihan otomatis secara manual.

      Eksekusi pernyataan SQL berikut untuk mengaktifkan tugas pembersihan otomatis secara manual. Hanya tabel di database saat ini yang dapat dibersihkan.

      SELECT squeeze.start_worker(); -- Aktifkan

      Nonaktifkan tugas pembersihan otomatis.

      SELECT squeeze.stop_worker();   -- Nonaktifkan
    • Aktifkan tugas pembersihan otomatis secara otomatis.

      Konfigurasikan parameter di konsol ApsaraDB RDS dan mulai ulang database untuk mengaktifkan tugas pembersihan secara otomatis. Untuk informasi lebih lanjut, lihat Modifikasi parameter instance ApsaraDB RDS for PostgreSQL.

      Dalam contoh berikut, database database1 dan database2 dibersihkan menggunakan akun rds_superuser. Akun rds_superuser harus merupakan akun istimewa.

      Catatan

      Sebelum tugas pembersihan dilakukan, ekstensi pg_squeeze dibuat secara terpisah di database database1 dan database2. Untuk informasi lebih lanjut, lihat Buat dan hapus ekstensi.

      squeeze.worker_autostart = 'database1 database2'
      squeeze.worker_role = rds_superuser

Referensi

Untuk informasi lebih lanjut, lihat pg_squeeze.