Ich bin mit SQL Server 2008 R2 und hatte unter AbfrageOptimierung Zeilennummer Abfrage
select * from
(
select d.ID as ID,
....
....
ROW_NUMBER() OVER
(
ORDER BY #some field
) AS RowNum
from
/*some table*/
LEFT join
(select Device_ID,
Level,
ROW_NUMBER() over (partition by Device_ID order by id desc) as rn
from #sometable as de WITH (NOLOCK)
where #some condition
) t
where t.rn = 1)tmp on ID=tmp.Device_ID **/* sort operation 1*/**
/*some more joins */
WHERE /*some condition*/
) as DbD
where RowNum BETWEEN @SkipRowsLocal and (@SkipRowsLocal + @TakeRowsLocal - 1)
order by RowNum
Ich versuche Paginierung Art von Abfrage von Probe zu implementieren http://blog.sqlauthority.com/2013/04/14/sql-server-tricks-for-row-offset-and-paging-in-various-versions-of-sql-server/
aber sieht aus wie es ist sehr langsam ausgeführt wird, wenn ich in Abfrage Plan sort Operation untersucht verbraucht fast 50% der Abfrage Zeit und ich denke, es ist die erste Sortieroperation, die ich als 1 markiert, im Grunde in der temporären Tabelle t möchte ich den neuesten Wert abrufen und in der äußeren Reihe Nummer wollte ich holen sage nur 40 Datensätze.
Es ist im Grunde wie 10K Zeilen zu sortieren und dann 40 davon zu nehmen, gibt es eine Möglichkeit, diese Abfrage zu verbessern?
Ausführungsplan und Tabelle Definition, bitte –
haben Sie einen Index DeviceId, ID? Auch ein Index über 'ORDER BY #some field' - was auch immer das Feld #some ist? – Cato
Versuchen Sie 'where t.rn = 1' in' äußere Anwendung zu drehen (wählen Sie oben 1' ohne Zeilennummer (die zweite). –