Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Beginnen Sie mit dem Anzeigen der Abfrageergebnisse, bevor die Abfrage endet

Umschreibung:

Es scheint, dass Sie eine Art System wünschen, in dem zwei (oder mehr) Threads arbeiten können. Ein Thread wäre damit beschäftigt, die Daten synchron aus der Datenbank abzurufen und seinen Fortschritt an den Rest des Programms zu melden. Der andere Thread würde sich mit der Anzeige befassen.

Es ist nicht klar, dass Ihre Abfrage 500.000 Zeilen zurückgeben wird (wir hoffen, dass dies nicht der Fall ist), obwohl sie möglicherweise alle 500.000 Zeilen scannen muss (und möglicherweise bisher nur 23 Zeilen gefunden hat, die übereinstimmen). Die Bestimmung der Anzahl der zurückzugebenden Zeilen ist schwierig; die Bestimmung der Anzahl der zu scannenden Zeilen ist einfacher; Es ist sehr schwierig, die Anzahl der bereits gescannten Zeilen zu bestimmen.

Der Benutzer hat also über die 23. Zeile hinaus gescrollt, aber die Abfrage ist noch nicht abgeschlossen.

Hier gibt es ein paar Probleme. Das DBMS (das gilt für die meisten Datenbanken und sicherlich für IDS) bleibt bei der Verarbeitung der einen Anweisung bis zur aktuellen Verbindung gebunden. Es ist schwierig, Feedback zum Fortschritt einer Abfrage zu erhalten. Sie könnten sich die geschätzten Zeilen ansehen, die zurückgegeben wurden, als die Abfrage gestartet wurde (Informationen in der SQLCA-Struktur), aber diese Werte sind wahrscheinlich falsch. Sie müssten entscheiden, was zu tun ist, wenn Sie Zeile 200 von 23 erreichen, oder Sie gelangen nur zu Zeile 23 von 5.697. Es ist besser als nichts, aber es ist nicht zuverlässig. Es ist sehr schwierig festzustellen, wie weit eine Abfrage fortgeschritten ist. Und einige Abfragen erfordern eine tatsächliche Sortieroperation, was bedeutet, dass es sehr schwer vorherzusagen ist, wie lange es dauern wird, da keine Daten verfügbar sind, bis die Sortierung abgeschlossen ist (und sobald die Sortierung abgeschlossen ist, bleibt nur die Zeit für die Kommunikation dazwischen das DBMS und die Anwendung, um die Lieferung der Daten zu verzögern).

Informix 4GL hat viele Tugenden, aber Thread-Unterstützung gehört nicht dazu. Die Sprache wurde nicht im Hinblick auf Thread-Sicherheit entwickelt, und es gibt keine einfache Möglichkeit, sie in das Produkt nachzurüsten.

Ich denke, dass das, was Sie suchen, am einfachsten durch zwei Threads unterstützt wird. In einem Single-Threaded-Programm wie einem I4GL-Programm gibt es keine einfache Möglichkeit, Zeilen abzurufen und darauf zu warten, dass der Benutzer weitere Eingaben macht (z. B. „zur nächsten Seite voller Daten nach unten scrollen“) /P>

Die FIRST ROWS-Optimierung ist ein Hinweis auf das DBMS; es kann der wahrgenommenen Leistung einen signifikanten Vorteil verleihen oder auch nicht. Insgesamt bedeutet dies in der Regel, dass die Abfrage aus DBMS-Perspektive weniger optimal verarbeitet wird, aber die schnelle Bereitstellung von Ergebnissen für den Benutzer kann wichtiger sein als die Arbeitsbelastung des DBMS.

Irgendwo unten in einer viel abgelehnten Antwort rief Frank (aber bitte nicht SCHREIEN):

OK. Die Schwierigkeit besteht hier darin, den IPC zwischen den beiden clientseitigen Prozessen zu organisieren. Wenn beide mit dem DBMS verbunden sind, haben sie getrennte Verbindungen, und daher sind die temporären Tabellen und Cursor einer Sitzung für die andere nicht verfügbar.

Nicht alle Abfragen führen zu einer temporären Tabelle, obwohl die Ergebnismenge für einen Scroll-Cursor normalerweise etwas hat, das ungefähr einer temporären Tabelle entspricht. IDS muss die temporäre Tabelle hinter einem Scroll-Cursor nicht sperren, da nur IDS auf die Tabelle zugreifen kann. Wenn es sich um eine normale temporäre Tabelle handeln würde, wäre es immer noch nicht nötig, sie zu sperren, da nur die Sitzung, die sie erstellt hat, darauf zugreifen kann.

Vielleicht wäre eine genauere Statusmeldung:

Searching 500,000 rows...found 23 matching rows so far

Wahrscheinlich; Sie können auch eine schnelle und genaue Zählung mit 'SELECT COUNT(*) FROM TheTable' erhalten; dies scannt nichts, sondern greift einfach auf die Steuerdaten zu - wahrscheinlich effektiv die gleichen Daten wie in der nrows-Spalte der SMI-Tabelle sysmaster:sysactptnhdr.

Das Spawnen eines neuen Prozesses ist also nicht unbedingt ein Erfolgsrezept; Sie müssen die Abfrageergebnisse aus dem erzeugten Prozess in den ursprünglichen Prozess übertragen. Wie ich bereits sagte, würde eine Multithread-Lösung mit separaten Anzeige- und Datenbankzugriffs-Threads nach einiger Zeit funktionieren, aber es gibt Probleme, dies mit I4GL zu tun, da es nicht Thread-fähig ist. Sie müssen noch entscheiden, wie der clientseitige Code die Informationen für die Anzeige speichern soll.