2009-07-03 10 views
7

In Sql Server 2008 sind viele Optionen für Datenbank-Paging über gespeicherte Prozedur verfügbar. Siehe zum Beispiel here und here.Welche Paging-Methode (Sql Server 2008) für die beste Leistung?

OPTIONEN:

  1. ROW_NUMBER() Funktion
  2. ROWCOUNT
  3. CURSORS
  4. temporäre Tabellen
  5. Verschachtelte SQL-Abfragen
  6. ANDERE

Paging ROW_NUMBER() bekannt performance issues haben:

Bitte raten, die Paging-Methode die beste Leistung hat (für große Tabellen mit JOIN)?

Bitte geben Sie nach Möglichkeit auch Links zu relevanten Artikeln an.

Vielen Dank.

+0

Sie sollten wahrscheinlich etwa 300 rep Prämie fügen den Detaillierungsgrad Sie ... –

Antwort

3

Eine Frage, die Sie beantworten müssen, ist, wenn Sie die Gesamtanzahl der Zeilen für den Endbenutzer anzeigen möchten. Um die Nummer der letzten Seite zu berechnen, benötigen Sie auch die letzte Zeilennummer.

Wenn Sie auf diese Informationen verzichten können, ist eine temporäre Tabelle eine gute Option. Sie können den Schlüsselbund auswählen und LIMIT verwenden, um Schlüssel bis zu dem Schlüssel abzurufen, an dem Sie interessiert sind. Wenn Sie dies richtig tun, werden im typischen Anwendungsfall nur die ersten paar Seiten abgerufen.

Wenn Sie die letzte Seitenzahl benötigen, können Sie ROW_NUMBER() verwenden. Die Verwendung einer temporären Tabelle ist nicht viel schneller, da Sie die LIMIT-Klausel nicht verwenden können, wodurch diese Strategie einer ROW_NUMBER() - Berechnung entspricht.

+0

+1 fragen zu entsprechen, die eine wichtige Unterscheidung zu machen - in der Praxis Ich brauche die Gesamtzeilenanzahl immer. Leistungstests, die das nicht beinhalten, sind für mich nicht nützlich. – RedFilter

+0

Danke. Die Gesamtzahl der Zeilen wird benötigt, um die Seitennummer zu generieren. ROWCOUNT Methode scheint die schnellste zu sein, erfordert aber eine eindeutige Sortierspalte (die in meinem Fall nicht einzigartig ist) – dev

0

Wir können eine rowcount mit der folgenden Abfrage abrufen.

WITH data AS 
(
     SELECT ROW_NUMBER() OVER (order by memberid) AS rowid, memberid 
     FROM Customer 
) 
SELECT *, (select count(*) from data) AS TotalCount 
FROM data 
WHERE rowid > 20 AND rowid <= 30 
+0

Das OP weiß, dass er fragt, was der beste Weg ist und explizit auf einen anderen Ort, der Probleme beschreibt (Links zu noch eine andere Lösung) mit diesem Ansatz. –

Verwandte Themen