Genel, desteklenen bir yöntem gibi görünmüyor, ancak bireysel bir sorgunun ilerlemesini değerlendirmek için sınırlı bağlamlarda kullanılabilecek bazı püf noktaları var. Bunlardan bazıları.
Diziler
Bir SELECT veya UPDATE sorgusu herhangi birini içerdiğinde nextval(sequence_name)veya bir INSERT nextvalvarsayılan olarak bir hedef sütuna sahipse , geçerli sıra değeri art arda ile başka bir oturumda sorgulanabilir SELECT sequence_name.last_value. Çalışır çünkü sekanslar işlemlerle sınırlı değildir. Yürütme planı, sıralama sorgu sırasında doğrusal olarak artırılacak şekilde olduğunda, bir ilerleme göstergesi olarak kullanılabilir.
pgstattuple
Pgstattuple contrib modülü veri sayfalarına doğrudan gözetleme işlevleri sağlar. Tupler boş bir masaya yerleştirildiğinde ve henüz tamamlanmadığında, dead_tuple_countalandaki pgstattuplefonksiyondan sayıldıkları görülüyor .
9.1 ile Demo: boş bir tablo oluşturun
CREATE TABLE tt AS (n numeric);
İçine 10M satır ekleyelim:
INSERT INTO tt SELECT * FROM random() from generate_series(1,10000000);
Başka bir oturumda, ekleme sırasında her saniye pgstattuple'ı kontrol edin:
$ while true;
do psql -Atc "select dead_tuple_count from pgstattuple('tt')";
sleep 1;
done
Sonuçlar:
0
69005
520035
1013430
1492210
1990415
2224625
2772040
3314460
3928660
4317345
4743770
5379430
6080950
6522915
7190395
7953705
8747725
9242045
0
Ekleme bittiğinde 0'a geri döner (tüm perdeler görünür ve canlanır).
Bu numara, tablo yeni yaratılmadığında da kullanılabilir, ancak başlangıçta dead_tuple_countsıfır olmayan bir değere sahip olması muhtemeldir ve aynı zamanda autovacuum gibi diğer yazma aktiviteleri devam ederse aynı zamanda değişebilir (muhtemelen? eşzamanlılık autovacuum ile beklemek
Ancak , oluşturma işlemi gerçekleştiği için tablo ifadenin kendisi tarafından oluşturulmuşsa ( CREATE TABLE ... AS SELECTveya SELECT * INTO newtable) kullanılamaz. Çözüm, çizelgeyi satır içermeyen (ekleme LIMIT 0) oluşturmak ve bir sonraki işlemde doldurmak olacaktır.
pgstattupleÜcretsiz gelmediğini unutmayın : Her aramada tüm masayı tarar. Ayrıca süper kullanıcılar ile sınırlıdır.
Özel sayaç
Pavel Stehule'un blogunda, C'de uygulanan ve belirtilen sayıda idamda BİLDİRİMİ yükselten bir sayaç işlevi sağlar . Yürütücünün çağırmasına izin vermek için işlevi bir şekilde sorguyla birleştirmeniz gerekir. Sorgu sırasında bildirimler gönderilir ve ayrı bir oturuma ihtiyaç duymazlar, yalnızca onları görüntüleyen bir SQL istemcisi ( psqlaçık aday olur).
İhbarları yükseltmek için yeniden yapılan INSERT INTO örneği:
/* transformation */
INSERT INTO destination_table
SELECT (r).*
FROM (SELECT counter(to_destination_table(_source), 1000, true) r
FROM source _source) x
İşlevler için stackoverflow ile ilgili soru:
Uzun süren PostgreSQL işlevinden istemciye ilerleme nasıl bildirilir?
Gelecek seçenekler?
Mayıs 2017'den itibaren, geliştirici topluluğuna gelecek vaat eden bir yama var:
[PATCH v2] Uzun süredir devam eden SQL sorgularının ilerlemesini izlemek için ilerleme komutu
PostgreSQL 11 veya sonraki sürümlerinde genel bir çözüm olarak ortaya çıkabilir. Devam eden çalışma özelliklerine katılmak isteyen kullanıcılar, düzeltme ekinin en son sürümünü uygulayabilir ve önerilen PROGRESSkomutu deneyebilir .
pvKomuta daha önce rastlamamıştım ve varsayılan olarak Debian sunucumda kurulmamıştı, ama depoda. Açıklamada "pv (Pipe Viewer), verilerin ne kadar hızlı bir şekilde geçtiğinin görsel bir gösterimini vermek için iki işlem arasında herhangi bir normal boru hattına yerleştirilebileceğini" söylüyor. Çok kullanışlı bir komut!