Jak wspomniał Daniel Vérité, wydaje się, że nie ma ogólnego rozwiązania. Podczas ładowania danych do tabeli z pliku można zastosować następującą technikę, aby uzyskać postęp ładowania.
Pasek postępu konsoli poleceń COPY
Utwórz pustą tabelę.
CREATE TABLE mytest (n int);
Utwórz plik danych z 10 milionami linii do załadowania do tabeli.
$ seq 10000000 > /tmp/data.txt
Załaduj dane z pliku do tabeli i wyświetl pasek postępu.
$ pv /tmp/data.txt | psql -c "COPY mytest FROM STDIN;"
Próbny
Jak to działa
Za pomocą opcji STDIN poleceń kopiowania możemy wprowadzić dane do operacji kopiowania z innego procesu. Komenda pv wyświetli plik i będzie śledzić jego postęp, wyświetlając pasek postępu, ETA, całkowity czas, jaki upłynął i szybkość transferu danych.
Graficzny pasek postępu polecenia KOPIUJ
Korzystając z tej samej ogólnej techniki, możemy wyświetlić pasek postępu w aplikacji graficznej lub aplikacji internetowej. Użycie Pythona na przykład moduł psycopg2 pozwala wywołać polecenie kopiowania z wybranym obiektem pliku. Następnie możesz śledzić, ile części Twojego pliku pliku zostało odczytane i wyświetlić pasek postępu.
pv
poleceniem i nie było ono domyślnie instalowane na moim serwerze Debian, ale jest w repozytorium. Opis mówi „pv (Pipe Viewer) można wstawić do dowolnego normalnego potoku między dwoma procesami, aby wizualnie wskazać, jak szybko dane przechodzą”. Bardzo przydatne polecenie!Wydaje się, że nie ma ogólnej, obsługiwanej metody, ale istnieją pewne sztuczki, których można użyć w ograniczonych kontekstach do oceny postępu pojedynczego zapytania. Tutaj są niektóre z nich.
Sekwencje
Gdy zapytanie SELECT lub UPDATE zawiera dowolne zapytanie
nextval(sequence_name)
lub INSERT manextval
domyślną kolumnę docelową , bieżąca wartość sekwencji może być wielokrotnie sprawdzana w innej sesji za pomocąSELECT sequence_name.last_value
. Działa, ponieważ sekwencje nie są ograniczone transakcjami. Jeśli plan wykonania jest taki, że sekwencja jest zwiększana liniowo podczas zapytania, można go użyć jako wskaźnika postępu.pgstattuple
Moduł contg pgstattuple zapewnia funkcje, które mogą podglądać bezpośrednio na stronach danych. Wygląda na to, że kiedy krotki są wstawiane do pustej tabeli i jeszcze nie zatwierdzone, są liczone w
dead_tuple_count
polu zpgstattuple
funkcji.Demo z wersją 9.1: utwórz pustą tabelę
Wstawmy do niego 10 mln wierszy:
W innej sesji sprawdzaj pgstattuple co sekundę podczas wstawiania:
Wyniki:
Po zakończeniu wstawiania spada do 0 (wszystkie krotki stają się widoczne i aktywne).
Tej sztuczki można również użyć, gdy tabela nie jest świeżo utworzona, ale wartość początkowa
dead_tuple_count
może mieć niezerową wartość i może również zmieniać się równocześnie, jeśli trwa inna czynność zapisu, taka jak autovacuum (przypuszczalnie? Nie wiesz, jaki poziom współbieżność oczekiwana z autovacuum).Jednak nie można go użyć, jeśli tabela jest tworzona przez samą instrukcję (
CREATE TABLE ... AS SELECT
lubSELECT * INTO newtable
), ponieważ tworzenie jest transakcyjne. Obejściem tego problemu byłoby utworzenie tabeli bez wierszy (dodanieLIMIT 0
) i wypełnienie jej w następnej transakcji.Pamiętaj, że
pgstattuple
nie jest darmowy: skanuje cały stół przy każdym połączeniu. Również ogranicza się do superużytkowników.Licznik niestandardowy
Na blogu Pavla Stehule'a zapewnia on funkcję licznika zaimplementowaną w C, która podnosi UWAGI przy określonej liczbie wykonań. Musisz w jakiś sposób połączyć funkcję z zapytaniem, aby wykonawca mógł je wywołać. Powiadomienia są wysyłane podczas zapytania i nie potrzebują osobnej sesji, tylko klient SQL, który je wyświetla (
psql
jest oczywistym kandydatem).Przykład przeróbki INSERT INTO w celu podniesienia uwagi:
Powiązane pytanie dotyczące przepływu stosu dla funkcji:
Jak zgłosić postęp od długotrwałej funkcji PostgreSQL do klienta
Przyszłe opcje?
Od maja 2017 r. Do społeczności programistów została dostarczona obiecująca łatka: [PATCH v2] Polecenie Progress do monitorowania postępu długotrwałych zapytań SQL
co może skończyć jako ogólne rozwiązanie w PostgreSQL 11 lub nowszym. Użytkownicy, którzy chcą uczestniczyć w funkcjach w toku, mogą zastosować najnowszą wersję poprawki i wypróbować proponowane
PROGRESS
polecenie.źródło
Dopóki funkcjonalność raportu postępu nie zostanie rozszerzona, jak wspomniał @AmirAliAkbari w swojej odpowiedzi, oto obejście obejścia na poziomie systemu operacyjnego.
Działa to tylko w systemach Linux, ale prawdopodobnie istnieją łatwo dostępne w Internecie podobne rozwiązania dla dowolnych systemów operacyjnych.
Największą zaletą, a także wadą PostgreSQL, że wszystkie jej backendów są proste jednowątkowy procesy, za pomocą
lseek()
,read()
iwrite()
manipulować swoje pliki stole, podczas gdy są one oddziałujących na wspólną mem i zamków.Powoduje to, że wszystkie procesy zaplecza działają zawsze na jednym zapytaniu, które można łatwo znaleźć i łatwo
strace
d.Po pierwsze, możesz zobaczyć backend PID z
SELECT * FROM pg_stat_activity;
:Trzecia kolumna to pid. W PostgreSQL jest taki sam jak pid procesu pend dla backendu.
Następnie możesz utworzyć ścieżkę, na przykład przez
strace -p 20019 -s 8192
: (-s 8192
jest przydatny, ponieważ postgresql działa z blokami o długości 8192 bajtów).Znaczenie:
sendto
zdarza się, jeśli backend odpowiada coś na klienta. W tym przykładzie odpowiada na wynikINSERT
zapytania.recvfrom
dzieje się, jeśli backend pobiera coś od klienta. Zazwyczaj jest to nowe zapytanie, w tym przykładzie, jeszcze jednoINSERT
.lseek
dzieje się, jeśli backend przełącza pozycję w pliku tabeli.read
dzieje się, jeśli backend odczytuje blok z pliku tabeli.write
dzieje się, jeśli backend zapisuje blok w pliku tabeli.W przypadku
read
iwrite
możesz również zobaczyć zawartość tego bloku w tabeli. Bardzo pomaga zrozumieć, co robi i gdzie to jest.W przypadku
recvfrom
możesz zobaczyć rzeczywiste zapytanie jakie ma backend.źródło
Jak powiedziano w innych odpowiedziach, obecnie ogólnie nie ma bezpośredniego sposobu na raportowanie postępów.
Jednak począwszy od 9.6, przy każdym
VACUUM
uruchomieniupg_stat_progress_vacuum
widok będzie zawierał jeden wiersz dla każdego backendu (w tym procesów roboczych autovacuum), który obecnie odkurza. Dalsze szczegółypg_stat_progress_vacuum
można znaleźć w dokumentacji: 27.4 Raportowanie postępów .źródło