EDIT:Ich warte immer noch auf weitere Antworten. Vielen Dank!Was ist eine effiziente Methode zum Paging durch sehr große Ergebnismengen in SQL Server 2005?
In SQL 2000 Tagen habe ich Temptabelle Methode zu verwenden, in dem Sie eine temporäre Tabelle mit neuen Identitätsspalte und Primärschlüssel erstellen Sie dann wählen, wo Identitätsspalte zwischen A und B.
Wenn SQL 2005 kam entlang ich fand heraus über Row_Number()
und ich benutze es seitdem ...
Aber jetzt fand ich ein ernstes Leistungsproblem mit Row_Number()
. Es funktioniert sehr gut, wenn Sie mit nicht-gigantischen Resultsets arbeiten und eine Identitätsspalte sortieren. Allerdings es führt sehr schlecht, wenn Sie mit arbeiten große Ergebnissätze wie über 10.000 Datensätze und Sortierung über nicht Identität Spalte. Row_Number()
funktioniert schlecht, auch wenn Sie nach einer Identitätsspalte sortieren, wenn die Ergebnismenge über 250.000 Datensätze beträgt. Für mich kam es zu einem Punkt, wo es einen Fehler wirft, „Befehl Timeout!“
Was Sie Paginieren eine große Ergebnismenge auf SQL 2005 zu tun verwenden? Ist die temporäre Tabellenmethode in diesem Fall noch besser? Ich bin nicht sicher, ob diese Methode besser funktioniert ... Aber einige sagen, dass es ein Problem gibt, eine falsche Zeilennummer zu geben, wenn Sie einen mehrspaltigen Primärschlüssel haben.
In meinem Fall muss ich in der Lage sein, die Ergebnismenge durch eine Datumsspalte für meine Produktions-Web-App zu sortieren.
Lassen Sie mich wissen, was Sie für leistungsstarke Paginierung in SQL 2005 verwenden. Und ich würde auch gerne eine clevere Möglichkeit kennen, Indizes zu erstellen. Ich vermute, dass die Wahl der richtigen Primärschlüssel und/oder Indizes (Clustered/Non-Clustered) eine große Rolle spielen wird.
Vielen Dank im Voraus.
P.S. Weiß jemand, was Stackoverflow verwendet?
EDIT:-Mine sieht ungefähr so aus ...
SELECT postID, postTitle, postDate
FROM
(SELECT postID, postTitle, postDate,
ROW_NUMBER() OVER(ORDER BY postDate DESC, postID DESC) as RowNum
FROM MyTable
) as DerivedMyTable
WHERE RowNum BETWEEN @startRowIndex AND (@startRowIndex + @maximumRows) - 1
postID: Int, Identität (Autoinkrement), Primärschlüssel
nachdatieren: Datetime
EDIT: Verwenden alle Row_Number()?
Vielen Dank für Ihre Eingabe. Ich habe meine Frage aktualisiert. –