Sql-Server 2012 holt vs alte row_number Leistung. Was vermisse ich? Warum ist row_number 17x schneller?

9

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: Ссылка

    
Joel Wilson 26.09.2013, 05:49
quelle

2 Antworten

1

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.

    
MtwStark 15.06.2016 14:29
quelle
0

Ссылка Fetch funktioniert am besten für 2012 nach den obigen ...

    
Nikolay 16.10.2013 18:24
quelle