Memantau Perkembangan Konstruksi Indeks di PostgreSQL

36

Apakah ada cara untuk memantau kemajuan pembuatan indeks di PostgreSQL. Saya membuat indeks di atas meja besar dan saya ingin melihat seberapa cepat ini terjadi.

Apakah ada cara untuk memonitor ini?

myahya
sumber
jika Anda menggunakan psql, Anda harus mencoba \ timing
sftsz

Jawaban:

21

Menurut halaman Pemeliharaan Indeks Postgres Wiki , Anda dapat mengetahui status saat ini dari semua indeks Anda dengan:

SELECT
  t.tablename,
  indexname,
  c.reltuples AS num_rows,
  pg_size_pretty(pg_relation_size(quote_ident(t.tablename)::text)) AS table_size,
  pg_size_pretty(pg_relation_size(quote_ident(indexrelname)::text)) AS index_size,
  CASE WHEN indisunique THEN 'Y'
    ELSE 'N'
  END AS UNIQUE,
  idx_scan AS number_of_scans,
  idx_tup_read AS tuples_read,
  idx_tup_fetch AS tuples_fetched
FROM pg_tables t
  LEFT OUTER JOIN pg_class c ON t.tablename=c.relname
  LEFT OUTER JOIN
    ( SELECT c.relname AS ctablename, ipg.relname AS indexname, x.indnatts AS number_of_columns, idx_scan, idx_tup_read, idx_tup_fetch, indexrelname, indisunique FROM pg_index x
      JOIN pg_class c ON c.oid = x.indrelid
      JOIN pg_class ipg ON ipg.oid = x.indexrelid
      JOIN pg_stat_all_indexes psai ON x.indexrelid = psai.indexrelid )
    AS foo
  ON t.tablename = foo.ctablename
WHERE t.schemaname='public'
ORDER BY 1,2;

Kolom num_rowsmenunjukkan berapa banyak baris yang dicakup oleh indeks Anda dan index_sizeakan tumbuh ketika indeks sedang dibangun.

databyte
sumber
8
Saya menduga ini mungkin tidak berfungsi untuk indeks baru , yang mungkin tidak terlihat dalam katalog sampai transaksi yang membuatnya dilakukan.
mustaccio
@ustaccio Anda benar. Saya membuat indeks yang membutuhkan waktu lama, dan perintah di atas hanya menampilkan indeks yang sudah dibuat; itu tidak akan menampilkan indeks di mana 'CREATE INDEX' masih dalam proses.
orange80
1
REINDEX TABLE memblokir permintaan ini. Setidaknya, itu terjadi ketika saya menjalankannya pada 9,6.
RonJohn
10

Jadi, tidak ada cara yang baik untuk melakukannya, tetapi jika Anda benar-benar perlu tahu ... pertama-tama hitung jumlah ruang yang harus diambil indeks, berdasarkan pada ukuran data * baris + overhead. Anda kemudian dapat menggunakan sesuatu seperti pfiles atau pgtruss untuk menemukan file yang sedang ditulis dalam $ PGDATA; jika indeks Anda lebih dari 1GB, itu akan menjadi serangkaian file seperti nnnnn.n, di mana set pertama n konsisten, dan n kenaikan terakhir untuk setiap file GB. Setelah Anda tahu berapa banyak file yang dibuat, Anda dapat menonton pertumbuhan dan mencari tahu seberapa dekat Anda dengan penyelesaian. Perkiraan kasar, tapi mungkin itu membantu.

xzilla
sumber
4

Tidak, tidak ada, bahkan jika Anda sedang membangunnya dalam mode CONCURRENT. Meskipun di masa lalu saya telah mengawasi ukuran file dalam direktori database, ini tidak benar-benar berguna karena Anda hanya bisa menebak seberapa besar ukurannya.

araqnid
sumber
3

Ini akan dimungkinkan dalam rilis PostgreSQL 12 mendatang (harus dirilis pada 3 Oktober 2019).

SELECT 
  now()::TIME(0), 
  a.query, 
  p.phase, 
  p.blocks_total, 
  p.blocks_done, 
  p.tuples_total, 
  p.tuples_done
FROM pg_stat_progress_create_index p 
JOIN pg_stat_activity a ON p.pid = a.pid;

Lihat dokumen untuk tampilan pg_stat_progress_create_index dan posting blog depesz untuk detailnya.

Envek
sumber