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.
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.
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.
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.
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
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.
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.
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
sein1 - 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.
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.
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.
Tags und Links sql sqlanywhere