Tampaknya tidak ada metode umum yang didukung, tetapi ada beberapa trik yang dapat digunakan dalam konteks terbatas untuk mengevaluasi kemajuan permintaan individu. Ini beberapa di antaranya.
Urutan
Ketika kueri SELECT atau UPDATE menyertakan nextval(sequence_name)
, atau INSERT memiliki kolom tujuan nextval
sebagai default, nilai urutan saat ini dapat berulang kali ditanyai di sesi lain dengan SELECT sequence_name.last_value
. Ini berfungsi karena urutan tidak dibatasi oleh transaksi. Ketika rencana eksekusi sedemikian rupa sehingga urutannya meningkat secara linear selama permintaan, itu dapat digunakan sebagai indikator kemajuan.
pgstattuple
The pgstattuple modul contrib menyediakan fungsi yang dapat mengintip secara langsung di halaman data. Tampaknya ketika tupel dimasukkan ke dalam tabel kosong dan belum dikomit, mereka dihitung di dead_tuple_count
bidang dari pgstattuple
fungsi.
Demo dengan 9.1: buat tabel kosong
CREATE TABLE tt AS (n numeric);
Mari kita masukkan baris 10M ke dalamnya:
INSERT INTO tt SELECT * FROM random() from generate_series(1,10000000);
Di sesi lain, periksa pgstattuple setiap detik selama memasukkan:
$ while true;
do psql -Atc "select dead_tuple_count from pgstattuple('tt')";
sleep 1;
done
Hasil:
0
69005
520035
1013430
1492210
1990415
2224625
2772040
3314460
3928660
4317345
4743770
5379430
6080950
6522915
7190395
7953705
8747725
9242045
0
Itu jatuh kembali ke 0 ketika memasukkan selesai (semua tupel menjadi terlihat dan hidup).
Trik ini juga dapat digunakan ketika tabel tidak baru dibuat, tetapi inisial dead_tuple_count
cenderung memiliki nilai tidak nol dan juga dapat berubah secara bersamaan jika aktivitas penulisan lain seperti autovacuum sedang berlangsung (mungkin? Tidak yakin pada tingkat berapa concurrency yang diharapkan dengan autovacuum).
Namun itu tidak dapat digunakan jika tabel dibuat oleh pernyataan itu sendiri ( CREATE TABLE ... AS SELECT
atau SELECT * INTO newtable
), karena pembuatannya ditransaksikan. Solusinya adalah membuat tabel tanpa baris (tambahkan LIMIT 0
) dan isi di transaksi berikutnya.
Catatan yang pgstattuple
tidak datang gratis: ini memindai seluruh tabel di setiap panggilan. Juga terbatas untuk pengguna super.
Penghitung khusus
Dalam blog Pavel Stehule, ia menyediakan fungsi penghitung yang diimplementasikan dalam C yang menimbulkan PEMBERITAHUAN pada jumlah eksekusi yang ditentukan. Anda harus menggabungkan fungsi dengan kueri untuk membiarkan eksekutor memanggilnya. Pemberitahuan dikirim selama permintaan dan mereka tidak perlu sesi terpisah, hanya klien SQL yang menampilkannya ( psql
menjadi kandidat yang jelas).
Contoh INSERT INTO yang dikerjakan ulang untuk menyampaikan pemberitahuan:
/* transformation */
INSERT INTO destination_table
SELECT (r).*
FROM (SELECT counter(to_destination_table(_source), 1000, true) r
FROM source _source) x
Pertanyaan terkait tentang stackoverflow, untuk fungsi:
Bagaimana melaporkan kemajuan dari fungsi PostgreSQL yang sudah berjalan lama ke klien
Opsi masa depan?
Pada Mei 2017, ada tambalan yang menjanjikan yang dikirimkan ke komunitas pengembang:
[PATCH v2] Perintah kemajuan untuk memantau perkembangan permintaan SQL yang sudah berjalan lama
yang mungkin berakhir sebagai solusi umum di PostgreSQL 11 atau lebih baru. Pengguna yang merasa ingin berpartisipasi dalam fitur yang sedang berjalan mungkin menerapkan versi tambalan terbaru dan mencoba PROGRESS
perintah yang diusulkan .
pv
perintah sebelumnya, dan itu tidak diinstal pada server Debian saya secara default, tetapi itu dalam repo. Deskripsi mengatakan "pv (Penampil Pipa) dapat dimasukkan ke dalam pipa normal antara dua proses untuk memberikan indikasi visual tentang seberapa cepat data melewati". Perintah yang sangat berguna!