Mengelola autovacuum dengan indeks berukuran besar - Layanan Basis Data Relasional Amazon

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Mengelola autovacuum dengan indeks berukuran besar

Sebagai bagian dari operasinya, autovacuum akan melakukan beberapa fase vakum saat berjalan di tabel. Sebelum tabel dibersihkan, semua indeksnya akan divakum terlebih dahulu. Fase menghapus beberapa indeks berukuran besar akan menghabiskan banyak waktu dan sumber daya. Oleh karena itu, sebagai praktik terbaik, pastikan Anda mengontrol jumlah indeks di tabel dan menyingkirkan indeks yang tidak digunakan.

Untuk proses ini, pertama-tama periksa ukuran indeks keseluruhan. Kemudian, tentukan apakah ada indeks yang berpotensi tidak digunakan dan dapat dihapus seperti yang ditunjukkan dalam contoh berikut.

Untuk memeriksa ukuran tabel beserta indeksnya

postgres=> select pg_size_pretty(pg_relation_size('pgbench_accounts')); pg_size_pretty 6404 MB (1 row)
postgres=> select pg_size_pretty(pg_indexes_size('pgbench_accounts')); pg_size_pretty 11 GB (1 row)

Dalam contoh ini, ukuran indeks lebih besar dari tabel. Perbedaan ini dapat menyebabkan masalah performa karena indeks membengkak atau tidak digunakan sehingga berdampak pada operasi autovacuum serta operasi penyisipan.

Untuk memeriksa indeks yang tidak digunakan

Dengan menggunakan tampilan pg_stat_user_indexes, Anda dapat memeriksa seberapa sering indeks digunakan dengan kolom idx_scan. Dalam contoh berikut, indeks yang tidak digunakan memiliki nilai idx_scan dari 0.

postgres=> select * from pg_stat_user_indexes where relname = 'pgbench_accounts' order by idx_scan desc; relid | indexrelid | schemaname | relname | indexrelname | idx_scan | idx_tup_read | idx_tup_fetch -------+------------+------------+------------------+-----------------------+----------+--------------+--------------- 16433 | 16454 | public | pgbench_accounts | index_f | 6 | 6 | 0 16433 | 16450 | public | pgbench_accounts | index_b | 3 | 199999 | 0 16433 | 16447 | public | pgbench_accounts | pgbench_accounts_pkey | 0 | 0 | 0 16433 | 16452 | public | pgbench_accounts | index_d | 0 | 0 | 0 16433 | 16453 | public | pgbench_accounts | index_e | 0 | 0 | 0 16433 | 16451 | public | pgbench_accounts | index_c | 0 | 0 | 0 16433 | 16449 | public | pgbench_accounts | index_a | 0 | 0 | 0 (7 rows)
postgres=> select schemaname, relname, indexrelname, idx_scan from pg_stat_user_indexes where relname = 'pgbench_accounts' order by idx_scan desc; schemaname | relname | indexrelname | idx_scan ------------+------------------+-----------------------+---------- public | pgbench_accounts | index_f | 6 public | pgbench_accounts | index_b | 3 public | pgbench_accounts | pgbench_accounts_pkey | 0 public | pgbench_accounts | index_d | 0 public | pgbench_accounts | index_e | 0 public | pgbench_accounts | index_c | 0 public | pgbench_accounts | index_a | 0 (7 rows)
catatan

Statistik ini bersifat inkremental sejak statistik diatur ulang. Misalkan Anda memiliki indeks yang hanya digunakan pada akhir kuartal bisnis atau hanya untuk laporan tertentu. Ada kemungkinan bahwa indeks ini belum digunakan sejak statistik diatur ulang. Untuk informasi selengkapnya, lihat Fungsi Statistik. Indeks yang digunakan untuk menerapkan keunikan tidak akan memiliki pemindaian yang dilakukan dan tidak boleh diidentifikasi sebagai indeks yang tidak digunakan. Untuk mengidentifikasi indeks yang tidak digunakan, Anda harus memiliki pengetahuan mendalam tentang aplikasi dan pertanyaannya.

Untuk memeriksa kapan statistik terakhir basis data disetel ulang, gunakan pg_stat_database

postgres=> select datname, stats_reset from pg_stat_database where datname = 'postgres'; datname | stats_reset ----------+------------------------------- postgres | 2022-11-17 08:58:11.427224+00 (1 row)

Melakukan vakum di tabel secepat mungkin

RDSuntuk Postgre SQL 12 dan lebih tinggi

Jika Anda memiliki terlalu banyak indeks dalam tabel besar, instans DB Anda bisa mendekati transaksi ID wraparound (XID), yaitu saat XID penghitung membungkus ke nol. Jika tidak terkendali, situasi ini dapat mengakibatkan kehilangan data. Namun, Anda dapat dengan cepat melakuan vakum di tabel tanpa harus membersihkan indeks. RDSUntuk Postgre SQL 12 dan lebih tinggi, Anda dapat menggunakan VACUUM dengan klausa. INDEX_CLEANUP

postgres=> VACUUM (INDEX_CLEANUP FALSE, VERBOSE TRUE) pgbench_accounts; INFO: vacuuming "public.pgbench_accounts" INFO: table "pgbench_accounts": found 0 removable, 8 nonremovable row versions in 1 out of 819673 pages DETAIL: 0 dead row versions cannot be removed yet, oldest xmin: 7517 Skipped 0 pages due to buffer pins, 0 frozen pages. CPU: user: 0.01 s, system: 0.00 s, elapsed: 0.01 s.

Jika sesi autovacuum sudah berjalan, Anda harus menghentikannya untuk memulai manual. VACUUM Untuk informasi cara melakukan pembekuan vakum manual, lihat Melakukan pembekuan vakum manual.

catatan

Melewatkan pembersihan indeks secara terus-menerus dapat menyebabkan indeks menggembung sehingga berdampak pada performa pemindaian secara keseluruhan. Sebagai praktik terbaik, gunakan prosedur sebelumnya hanya untuk mencegah penyelesaian ID transaksi.

RDSuntuk Postgre SQL 11 dan lebih tua

Namun, RDS untuk Postgre SQL 11 dan versi yang lebih rendah, satu-satunya cara untuk memungkinkan vakum selesai lebih cepat adalah dengan mengurangi jumlah indeks di atas meja. Menghapus sementara indeks dapat memengaruhi rencana kueri. Kami menyarankan Anda menjatuhkan indeks yang tidak digunakan terlebih dahulu, lalu jatuhkan indeks saat XID sampul sangat dekat. Setelah proses vakum selesai, Anda dapat membuat ulang indeks ini.