Wie kann Paging effektiv implementiert werden?

9

Ich habe eine Datenbankabfrage, die zu einer großen Ergebnismenge führen kann. Der Client, der die Daten anzeigt, empfängt die Daten über das Netzwerk. Daher bestand die Idee darin, die Menge der übertragenen Daten zu minimieren, indem nur die ersten 50 Ergebnisse aus der Datenbank abgerufen und an den Client gesendet wurden. Dann biete ich die Möglichkeit, zur zweiten Seite zu springen, um die nächsten 50 Ergebnisse usw. abzurufen (etwas Ähnliches, was z. B. Google anbietet).

Die Frage ist, wie Paging effektiv implementiert werden kann. Ich möchte sicherstellen, dass mssql so oft wie möglich den Cache verwendet und dass dieser nicht jedes Mal erneut ausgeführt wird, wenn ich das Paging ändere.

Es gibt mehr Clients, die gleichzeitig die Datenbank abfragen. Verwendete SQL-Engine: MS SQL 2005

Meine Ideen waren:

  • Verwenden Sie vorbereitete SQL-Anweisungen, um die gemeinsame Nutzung des Ausführungsplans sicherzustellen
  • Verwenden Sie die Variable ROW_COUNT, um nur die erforderlichen Zeilen abzurufen

Aber ist es wirklich der effektivste Weg? Oder denken Sie, dass es besser wäre, die gesamte Ergebnismenge abzurufen und Paging in den Code zu implementieren, der die Daten an den Client sendet?

Vielen Dank für Ihre Tipps!

Grüße, Tomas

Tomas Walek
quelle

Antworten:

7

Die Abfrage wird jedes Mal ausgeführt. SQL Server speichert die Ergebnisse nicht zwischen.

Richtiges Paging wird erst in SQL Server 2011 implementiert. Bis dahin haben Sie folgende Optionen (wie Sie angegeben haben):

  • ROW_NUMBER () und Abfragen bei Bedarf
  • Client-Caching

Eine vorbereitete SQL-Anweisung wird ebenfalls jedes Mal ausgeführt.

Wenn Sie einen fetten Client haben, ist das Caching lokal für den Client. Dies ist meistens in Ordnung, es sei denn, Sie haben zum Beispiel Millionen von Blobs.

In unserem Web-Client rendern wir alle Ergebnisse, zeigen jedoch nur die Top 100 an und haben die Schaltfläche "Alle anzeigen", um einen versteckten DIV mit den Zeilen 101+ zu erweitern. Wir zwischenspeichern nicht auf dem Webserver und bieten kein Paging an.

gbn
quelle
Vielen Dank. Und was ist ein besserer Ansatz, wenn der Benutzer einige Sortierkriterien ändert? Soll ich die Abfrage noch einmal mit den neuen Kriterien ausführen oder die Ergebnisse auf dem Client sortieren?
Tomas Walek
1
Ich würde im Client sortieren. Die Daten sind schon da. Ja, eine Datenbank kann gut sortieren, aber wenn die Daten identisch und verfügbar sind, warum dann einen weiteren Anruf tätigen? Wir verwenden ein jQuery-Add-On, um das Sortieren im Browser zu aktivieren :-)
gbn
4

Das hängt von Ihrer Umgebung ab. Ich würde einen Test mit beiden Methoden einrichten und herausfinden, welche für Sie am besten geeignet ist. Persönlich würde ich auf dem Server pagen. Je weniger Daten über das Kabel und weniger Daten im RAM des Clients, desto besser. Wenn Sie die Clientcomputerspezifikationen steuern können, der gesamte Datenverkehr über ein nicht gesättigtes LAN erfolgt und Clients immer schnell durch mehrere Seiten blättern, möchten Sie möglicherweise auf dem Client blättern.

Eric Humphrey - Lotsahelp
quelle
Vielen Dank. Eigentlich brauche ich beides: Die Kommunikation zwischen Server und Client ist in WCF implementiert, daher gibt es eine maximale Größe für eine Nachricht. Wenn die resultierende Menge diese Größe überschreitet, muss ich weitere Nachrichten senden, um die vollständigen Daten an den Client zu übertragen. Die Kunden blättern auch gerne schnell durch mehrere Seiten ... :(
Tomas Walek