Update: Infizieren Sie die folgende komplizierte Abfrage und überprüfen Sie diese Abfrage. Es sagt Fetch ist 98% im Vergleich zu 2% in Row_Number?
Ist Fetch noch ein Marketing-Schlüsselwort für SQL Server 2012?
------------------------- Ursprüngliche Frage --------------------
Lassen Sie mich klarstellen, dass, wo auch immer ich lese, ich finde, dass Fetch sehr schnell ist als die alte Row_Number-Funktion. Jedoch finde ich es fast das Gegenteil und auf eine lange Weise. Meine DB hat fast 0,2 Millionen Datensätze. Dies ist meine Abfrage mit Fetch:
%Vor%Die obige Abfrage dauert 17 Sekunden, um 50 Datensätze zu erzeugen. Dies ist der Abfrageplan:
Dies ist der XML-Abfrageplan, falls aus Bildern nicht klar ist: Ссылка
Nun ist dies die gleiche Abfrage, die alte Row_Number verwendet (und dieselben DB-Indizes und Spalten verwendet und Joins als Fetch verwendet):
%Vor%Diese Abfrage dauert weniger als 1 Sekunde! Dies ist der Abfrageplan dafür:
Also, was vermisse ich? Warum ist row_number schneller als Fetch?
Dies ist der Abfrageplan für rownum: Ссылка
Ich denke, dein Problem ist nicht OFFSET / FETCH vs ROW_NUMBER
In Ihrer ursprünglichen Frage sind die beiden Abfragen NICHT gleich,
Die erste Abfrage (OFFSET / FETCH) verpasst alle Filterbedingungen für Parameter, so dass sie auf größeren Basisdaten funktioniert und bei vielen JOINS die Anzahl der Datensätze schnell wächst
in der zweiten Abfrage (ROW_NUMBER) linke Joins werden nach der CTE-Ausführung angewendet und nur für übereinstimmende Datensätze (peta_rn & gt; @12 AND peta_rn & lt; = @ 13) reduziert sehr viele Datensätze zum Join.
die beiden Abfragen sind überhaupt nicht vergleichbar, ich denke, wenn Sie die CTE-Version mit OFFSET / FETCH schreiben, wird es schneller als die ROW_NUMBER-Version.
sprechen Sie tatsächlich über Ihre EDIT / UPDATE , überlegen Sie nicht, was EXECUTION PLAN sagt, führen Sie beide aus und messen Sie Timings. Sie werden feststellen, dass OFFSET / FETCH sowieso schneller ist.
Tags und Links sql sql-server sql-server-2008 tsql sql-server-2012