Ich habe einen Employee
Tisch mit einer Million Datensätzen. Ich verfolge SQL zum Paging von Daten in einer Webanwendung. Es funktioniert gut. Was ich jedoch als Problem sehe, ist, dass die abgeleitete Tabelle tblEmployee
alle Datensätze in der Employee
Tabelle auswählt (um die MyRowNumber
Werte zu erstellen ).
Ich denke, dies bewirkt die Auswahl aller Datensätze in der Employee
Tabelle.
Funktioniert es wirklich so? Oder ist SQL Server so optimiert, dass nur die 5 Datensätze aus der Originaltabelle ausgewählt Employee
werden?
DECLARE @Index INT;
DECLARE @PageSize INT;
SET @Index = 3;
SET @PageSize = 5;
SELECT * FROM
(SELECT ROW_NUMBER() OVER (ORDER BY EmpID asc) as MyRowNumber,*
FROM Employee) tblEmployee
WHERE MyRowNumber BETWEEN ( ((@Index - 1) * @PageSize )+ 1) AND @Index*@PageSize
Antworten:
Eine Alternative zum Testen könnte sein:
Ja, Sie haben zweimal auf den Tisch geschlagen, aber im CTE, in dem Sie den gesamten Tisch scannen, greifen Sie nur auf den Schlüssel zu, nicht auf ALLE Daten. Aber du solltest dir diesen Artikel wirklich ansehen:
http://www.sqlservercentral.com/articles/T-SQL/66030/
Und die anschließende Diskussion:
http://www.sqlservercentral.com/Forums/Topic672980-329-1.aspx
In SQL Server 2012 können Sie natürlich die neue
OFFSET
/FETCH NEXT
-Syntax verwenden:quelle
Obwohl Sie den Mechanismus dahinter möglicherweise nicht kennen, können Sie dies selbst testen, indem Sie die Leistung Ihrer Abfrage mit Folgendem vergleichen: Wählen Sie * aus Mitarbeiter.
Die neueren Versionen von SQL Server können zwar recht gut optimiert werden, dies kann jedoch von mehreren Faktoren abhängen.
Die Leistung Ihrer ROW_NUMBER-Funktion wird durch die Order By-Klausel bestimmt. In Ihrem Beispiel würden die meisten davon ausgehen, dass EmpID der Primärschlüssel ist.
Es gibt einige where- Klauseln, die so komplex und / oder schlecht codiert oder indexiert sind, dass Sie möglicherweise besser daran sind, nur den gesamten Datensatz zurückzugeben (dies ist selten und kann behoben werden). Die Verwendung von BETWEEN hat Probleme.
Bevor Sie davon ausgehen, dass es besser ist, alle Zeilen an Ihre Anwendung zurückzugeben und es herauszufinden, sollten Sie Ihre Abfrage optimieren. Überprüfen Sie die Schätzungen. Fragen Sie den Query Analyzer. Testen Sie einige Alternativen.
quelle
Ich weiß, dass die Frage row_number () betrifft, aber ich möchte eine neue Funktion von SQL Server 2012 hinzufügen. In SQL Server 2012 wird die neue Funktion OFFSET Fetch als nächste eingeführt und sie ist sehr schnell als row_number (). Ich habe es benutzt und es gibt mir ein gutes Ergebnis, hoffe ihr füllt auch die gleiche Erfahrung.
Ich fand ein Beispiel auf http://blogfornet.com/2013/06/sql-server-2012-offset-use/
das ist nützlich. Hoffe, es wird Ihnen auch bei der Implementierung neuer Funktionen helfen ....
quelle
Ich denke nicht, dass es auswertet, um alle Zeilen in der ursprünglichen Tabelle zurückzugeben. SQL Server optimiert. Andernfalls dauert es sehr lange, bis eine Million Einträge ausgewählt sind. Ich verwende dies derzeit und es ist viel schneller als die Auswahl aller Zeilen. Also, bekommt sicher nicht alle Zeilen. Es ist jedoch langsamer als nur das Abrufen der ersten fünf Zeilen, wahrscheinlich aufgrund des Zeitaufwands bei der Bestellung
quelle
quelle