Wir bauen ein Data Warehouse, in dem wir den Preis jedes einzelnen Produkts erfassen und diese Daten am Tag aufbewahren möchten. Es gibt eine Tabelle mit den FromDate
und ToDate
, die beide NULL
haben können.Eine bessere Alternative zu ROW_NUMBER, um einen einzelnen Datensatz pro Gruppe abzurufen
Die Logik der heutigen Preis zu finden ist:
- alle Datensätze ignorieren, wo die
FromDate
in der Zukunft. - Ignorieren Sie alle Datensätze, in denen die
ToDate
in der Vergangenheit ist. - Wenn mehrere Datensätze die obigen Anforderungen erfüllen, möchten wir den Preis ermitteln, bei dem
FromDate
der neueste Wert ist undToDate
dem aktuellen Datum am nächsten liegt. - Das System erlaubt Duplikate für die gleichen
FromDate
undToDate
, so dass wir dann durch den Primärschlüssel absteigend sortieren (neueste zuerst).
Um dieses Problem zu bewältigen, habe ich eine ROW_NUMBER
mit einem PARTITION
verwendet, um die Datensätze zu bestellen, und erhalten nur die erste. Das funktioniert, aber es dauert ungefähr 20 Minuten pro Tag (und trifft ziemlich hart auf tempdb
), da wir ungefähr 2 Millionen Datensätze haben, die aus dieser Abfrage erstellt werden.
Gibt es bessere Alternativen, die die Leistung der Abfrage erhöhen können?
Beachten Sie, dass die Geige ein allzu vereinfachte Beispiel der Daten und enthält nur relevante Teile für diese Frage.
Haben Sie Index auf dem Tisch ? –
Ja, Indizes sind nicht mein Problem. Ich bin wandernder, wenn es einen Weg gibt, dies ohne analytische Funktionen zu tun. Etwas, das vielleicht 'tempdb' freundlicher ist. Es ist möglich, dass dies der beste Weg ist, und aufgrund der Datenmenge, die ich habe, muss ich damit leben. – Lock
[** This **] (http://dba.stackexchange.com/questions/86415/retrieving-n-rows-per-group) könnte helfen. –