7 Stimmen

Optimieren von ROW_NUMBER() in SQL Server

Wir haben eine Reihe von Rechnern, die in sporadischen Abständen Daten in einer Datenbank aufzeichnen. Für jeden Datensatz möchte ich die Zeitspanne zwischen こん Aufnahme und die vorherige Aufnahme.

Ich kann dies mit ROW_NUMBER wie folgt tun:

WITH TempTable AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY Machine_ID ORDER BY Date_Time) AS Ordering
    FROM dbo.DataTable
)

SELECT [Current].*, Previous.Date_Time AS PreviousDateTime
FROM TempTable AS [Current]
INNER JOIN TempTable AS Previous 
    ON [Current].Machine_ID = Previous.Machine_ID
    AND Previous.Ordering = [Current].Ordering + 1

Das Problem ist, dass es vraiment langsam (mehrere Minuten bei einer Tabelle mit etwa 10k Einträgen) - ich habe versucht, separate Indizes für Machine_ID und Date_Time sowie einen einzelnen Join-Index zu erstellen, aber nichts hilft.

Gibt es eine Möglichkeit, diese Abfrage umzuschreiben, um schneller zu werden?

0voto

Philip Kelley Punkte 38051

Wenn Sie diese Daten häufig benötigen, sollten Sie sie nicht jedes Mal berechnen, wenn Sie die Daten abrufen. Warum fügen Sie nicht eine Spalte hinzu und berechnen/füllen sie, sobald eine Zeile hinzugefügt wird?

(Der zusammengesetzte Index von Remus macht die Abfrage schnell; wenn sie nur einmal ausgeführt wird, sollte sie noch schneller sein).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X