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
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
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
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.