Wie gebe ich Fortschrittsmeldungen aus einer SELECT-Anweisung aus?

8

Ich habe ein SQL-Skript, das Fortschrittsnachrichten ausgeben soll, während es ausgeführt wird. Die Ausgabe von Nachrichten zwischen SQL-Anweisungen ist einfach, aber ich habe einige sehr lange laufende INSERT INTO SELECTs. Gibt es eine Möglichkeit, eine Select-Anweisung Nachrichten so ausgeben zu lassen, wie zum Beispiel nach jeweils 1000 Zeilen oder alle 5 Sekunden?

Hinweis: Dies ist für SQL Anywhere, aber Antworten in jedem SQL-Dialekt sind in Ordnung.

    
Eric Burnett 24.09.2008, 19:48
quelle

12 Antworten

5

Es gibt keine Möglichkeit, den Ausführungsstatus einer einzelnen Abfrage abzurufen. Keine der Mainstream-Datenbank-Engines bietet diese Funktionalität.
Darüber hinaus würde ein messbarer Overhead aus jeder Fortschrittsimplementierung generiert werden, wenn einer vorhanden ist. Wenn also eine Abfrage bereits eine unangenehm lange Zeit benötigt, so dass Sie einen Fortschritt anzeigen möchten, kann dies zu einem Konstruktionsziel führen.
Sie können diesen Artikel zum Schätzen des SQL-Ausführungsfortschritts finden hilfreich, obwohl die praktischen Auswirkungen begrenzt sind.

    
Grank 24.09.2008 19:59
quelle
3

SQL selbst hat keine Vorkehrungen für solche Dinge. Jede Möglichkeit, dies zu tun, würde bedeuten, direkt mit der Datenbank-Engine zu sprechen, und wäre nicht standardübergreifend für Datenbanken.

    
Neall 24.09.2008 19:49
quelle
3

Wirklich die Idee des Fortschritts mit set-based Operationen (was eine relationale Datenbank verwendet) wäre nicht zu hilfreich, zumindest nicht wie angezeigt mit einem Fortschrittsbalken (Prozent done vs total). Zu der Zeit, als der Optimierer herausgefunden hat, was zu tun ist und wirklich die vollen Kosten der Operation verstanden hat, haben Sie bereits einen bedeutenden Teil der Operation abgeschlossen. Fortschrittsanzeigen sind eher für iterative Operationen gedacht als für Operationen.

Hier geht es um die Ausführung Ihrer allgemeinen SELECT-Anweisung. Für Einfügungen, die separate Anweisungen sind, gibt es alle Möglichkeiten, dies vom Übergebenden zu tun, indem die Verbrauchsrate der Anweisungen überwacht wird. Wenn es sich um Masseneinfügungen handelt (Auswahl in, Einfügung von und dergleichen), dann haben Sie wirklich das gleiche Problem, das ich oben beschrieben habe. Set-Operationen werden in einer Weise zusammengefasst, die einen Fortschrittsbalken-Typ der Anzeige etwas bedeutungslos macht.

    
Christopher Bortz 24.09.2008 19:55
quelle
3

Ich bin Mitglied im SQL Anywhere-Entwicklungsteam und derzeit gibt es keine Möglichkeit, dies zu tun. Ich kann nichts versprechen, aber wir überlegen, diese Art von Funktionalität zu einer zukünftigen Version hinzuzufügen.

    
Graeme Perrow 24.09.2008 20:12
quelle
2

Es gibt sicherlich keine SQL-Standardlösung dafür. Es tut mir leid, Doom-beladen zu sein, aber ich habe nichts gesehen, dass dies in Oracle, SQL Server, Sybase oder MySQL tun kann, also wäre ich nicht zu hoffnungsvoll für SQLAnywhere.

    
skaffman 24.09.2008 19:50
quelle
2

Ich stimme zu, dass SQL keine Möglichkeit hat, dies direkt zu tun. Eine Möglichkeit besteht darin, nur die TOP 1000 gleichzeitig einzufügen und dann Ihre Statusmeldung auszudrucken. Dann wiederhole es bei Bedarf (in irgendeiner Art von Schleife). Der Nachteil ist, dass Sie dann einen Weg brauchen, um zu verfolgen, wo Sie sind.

Ich sollte beachten, dass dieser Ansatz nicht so effizient ist, wie nur eine große INSERT

    
Matt N 24.09.2008 19:55
quelle
2

Folgendes würde ich tun (Sybase / SQL Server-Syntax):

%Vor%

Oder Sie könnten dies anhand von IDs tun (unter der Annahme, dass es sich bei Id um eine Zahl handelt):

%Vor%     
AJ. 02.10.2008 12:13
quelle
1

Ein Gedanke könnte sein, dass ein anderer separater Prozess die Anzahl der Zeilen in der Tabelle zählt, in der die Einfügung durchgeführt wird, um festzustellen, welcher Prozentsatz von ihnen bereits dort ist. Dies erfordert natürlich, dass Sie am Ende die Summe kennen. Dies wäre wahrscheinlich nur in Ordnung, wenn Sie sich keine Sorgen über Serverlast machen.

    
Darryl Hein 02.10.2008 01:31
quelle
0

Wenn Sie Toad nicht verwenden, können Sie eine Reihe von INSERT-Anweisungen aus einer Tabelle generieren und sie so konfigurieren, dass sie bei einer Benutzereingabefrequenz festgeschrieben werden. Sie könnten Ihre Skripte ein wenig modifizieren und dann sehen, wie viel von den neuen Daten im Lauf der Zeit festgelegt wurde.

    
Owen 24.09.2008 19:52
quelle
0

Sie können den Effekt für Ihre Benutzer simulieren, indem Sie mehrere Läufe zeitlich einteilen und dann einen Fortschrittsbalken mit der durchschnittlichen Anzahl von Aufzeichnungen / Sekunden erhalten.

Die einzigen anderen Wege werden

sein

1 - Sehen Sie in der API Ihrer Datenbank-Engine nach, ob dafür etwas vorgesehen ist

oder

2 - Brechen Sie Ihre INSERT-Anweisung in viele kleinere Anweisungen auf und berichten Sie über sie, während Sie fortfahren. Aber das wird erhebliche negative Auswirkungen auf die Performance haben.

    
JosephStyons 24.09.2008 20:16
quelle
0

Wenn Sie es benötigen oder Sie sterben, können Sie zum Einfügen, Aktualisieren, Löschen eine Auslöselogik mit db-Variablen verwenden, und von Zeit zu Zeit sql, um variable Daten abzurufen und dem Benutzer einen Fortschritt anzuzeigen.

>

Wenn Sie es verwenden möchten, kann ich ein Beispiel schreiben und es senden.

    
Zote 02.10.2008 01:10
quelle
0

Stolperte über diesen alten Faden und suchte nach etwas anderem. Ich stimme der Idee nicht zu, dass wir keine Fortschrittsinformationen wollen, nur weil es sich um eine Set-Operation handelt. Benutzer werden oft sogar lange warten, wenn sie wissen, wie lange es ist.

Folgendes möchte ich vorschlagen:

Protokollieren Sie bei jeder Ausführung die Anzahl der eingefügten Zeilen und die Gesamtzeit, fügen Sie dann am Anfang dieses Prozesses einen Schritt hinzu, um das Protokoll abzufragen und eine geschätzte Gesamtzeit zu berechnen. Wenn Sie Ihre Schätzung auf die letzten Läufe stützen, sollten Sie in der Lage sein, eine annehmbar gute Schätzung für die Wartezeit für die Sache zu geben, um zu beenden.

    
Joe 05.02.2014 21:21
quelle

Tags und Links