Seperti yang disebutkan oleh Daniel Vérité, sepertinya tidak ada solusi generik. Saat memuat data ke dalam tabel dari file, teknik berikut ini dapat digunakan untuk mendapatkan kemajuan pemuatan.
Baris kemajuan konsol perintah COPY
Buat tabel kosong.
CREATE TABLE mytest (n int);
Buat file data dengan 10 juta baris untuk dimuat ke dalam tabel.
$ seq 10000000 > /tmp/data.txt
Memuat data dari file ke dalam tabel dan menampilkan bilah kemajuan.
$ pv /tmp/data.txt | psql -c "COPY mytest FROM STDIN;"
Demo
Bagaimana ini bekerja?
Dengan menggunakan opsi salin perintah STDIN kita dapat memasukkan data untuk operasi salin dari proses lain. Perintah pv akan menampilkan file dan melacak progresnya yang menampilkan bilah progres, ETA, total waktu yang berlalu dan kecepatan transfer data.
SALIN perintah bilah kemajuan grafis
Dengan menggunakan teknik umum yang sama, kami dapat menampilkan bilah kemajuan dalam aplikasi grafis atau aplikasi berbasis web. Menggunakan python misalnya modul psycopg2 memungkinkan Anda memanggil perintah salin dengan objek file yang Anda pilih. Anda kemudian dapat melacak berapa banyak objek file Anda telah dibaca dan menampilkan bilah kemajuan.
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!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 tujuannextval
sebagai default, nilai urutan saat ini dapat berulang kali ditanyai di sesi lain denganSELECT 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 daripgstattuple
fungsi.Demo dengan 9.1: buat tabel kosong
Mari kita masukkan baris 10M ke dalamnya:
Di sesi lain, periksa pgstattuple setiap detik selama memasukkan:
Hasil:
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
atauSELECT * INTO newtable
), karena pembuatannya ditransaksikan. Solusinya adalah membuat tabel tanpa baris (tambahkanLIMIT 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:
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 .sumber
Hingga fungsionalitas laporan kemajuan tidak diperpanjang, seperti yang disebutkan @AmirAliAkbari dalam jawabannya, berikut adalah solusi tingkat OS.
Ini hanya berfungsi pada Linux, tetapi mungkin ada solusi serupa yang mudah googlable untuk sistem operasi apa pun.
Keuntungan terbesar dan juga kerugian dari PostgreSQL, bahwa semua backend-nya adalah proses single-threaded sederhana, menggunakan
lseek()
,read()
danwrite()
untuk memanipulasi file tabel mereka, sementara mereka berinteraksi pada mem dan kunci bersama.Hasil ini, semua proses backendnya bekerja selalu pada satu permintaan, yang dapat dengan mudah ditemukan, dan mudah
strace
d.Pertama, Anda dapat melihat PID backend dari
SELECT * FROM pg_stat_activity;
:Kolom ketiga adalah pid. Dalam PostgreSQL, itu sama dengan proses Linux pid dari backend.
Selanjutnya, Anda dapat meng-strace-nya, misalnya dengan a
strace -p 20019 -s 8192
: (-s 8192
berguna karena postgresql bekerja dengan blok panjang 8192 byte).Artinya:
sendto
terjadi jika backend menjawab sesuatu kepada klien. Dalam contoh, ini menjawab hasil dariINSERT
kueri.recvfrom
terjadi jika backend mendapatkan sesuatu dari klien. Ini biasanya kueri baru, dalam contoh, lagiINSERT
.lseek
terjadi jika backend beralih posisi dalam file tabel.read
terjadi jika backend membaca blok dari file tabel.write
terjadi jika backend menulis blok ke file tabel.Dalam kasus
read
danwrite
, Anda juga bisa melihat konten dari blok itu di tabel. Ini bisa sangat membantu untuk memahami, apa yang dilakukannya dan di mana itu.Dalam kasus ini
recvfrom
, Anda bisa melihat permintaan aktual apa yang didapat backend.sumber
Seperti yang dikatakan dalam jawaban lain, saat ini tidak ada cara langsung untuk melaporkan kemajuan secara umum.
Namun, mulai dari 9.6, setiap kali
VACUUM
berjalan,pg_stat_progress_vacuum
tampilan akan berisi satu baris untuk setiap backend (termasuk proses pekerja autovacuum) yang saat ini sedang menyedot debu. Rincian lebih lanjut tentangpg_stat_progress_vacuum
dapat ditemukan dalam dokumentasi: 27.4 Pelaporan Kemajuan .sumber