Ich habe also eine Funktion, die eine Reihe von Datensätzen zurückgibt, für die ich Paging auf meiner Website implementieren möchte. Es wurde mir vorgeschlagen, in SQL Server 2012 Offset / Fetch Next zu verwenden, um dies zu erreichen. Auf unserer Website haben wir einen Bereich, in dem die Gesamtzahl der Datensätze und die Seite aufgeführt sind, auf der Sie sich gerade befinden.
Zuvor hatte ich den gesamten Datensatz erhalten und konnte das Paging programmgesteuert darauf aufbauen. Wenn ich jedoch die SQL-Methode nur mit FETCH NEXT X ROWS verwende, werden mir nur X Zeilen zurückgegeben, sodass ich nicht weiß, wie hoch mein Gesamtdatensatz ist und wie ich meine minimalen und maximalen Seiten berechne. Die einzige Möglichkeit, dies zu erkennen, besteht darin, die Funktion zweimal aufzurufen, die erste Zeile zu zählen und die zweite mit FETCH NEXT auszuführen. Gibt es eine bessere Möglichkeit, die Abfrage nicht zweimal auszuführen? Ich versuche, die Leistung zu beschleunigen, nicht zu verlangsamen.
quelle
Bei der Verwendung der COUNT ( ) OVER () -Methode sind einige Leistungsprobleme aufgetreten . (Ich bin nicht sicher, ob es der Server war, da es 40 Sekunden dauerte, um 10 Datensätze zurückzugeben, und später keine Probleme hatte.) Diese Technik funktionierte unter allen Bedingungen, ohne COUNT ( ) OVER () verwenden zu müssen, und führt das aus gleiche Sache:
quelle
declare @result table ( ID int, Name nvarchar(max), counter int )
dann kann auf der obigen Aussage das endgültige außerhalb von CTE select sein:SELECT * into @result FROM TempResult, TempCount ORDER BY TempResult.Name OFFSET (@PageNum-1)*@PageSize ROWS FETCH NEXT @PageSize ROWS ONLY
falls SieBasierend auf James Mobergs Antwort :
Dies ist eine Alternative
Row_Number()
, wenn Sie nicht über SQL Server 2012 verfügen und OFFSET nicht verwenden könnenquelle