Ich habe eine Ansicht, die LAG verwendet.Fensterfunktionen in der Ansicht, die mit "wo" aufgerufen wird, gibt einen fehlerhaften Ausführungsplan aus
Wenn ich es mit "WHERE" aufrufen, bekommt es einen Ausführungsplan viel schlechter als wenn nur die Abfrage aufgerufen wird.
SELECT
ID,
PlacementID,
LAG(Reading, 1) OVER (PARTITION BY MeterNumber ORDER BY Date) AS Val
FROM dbo.ImportedReadingDay
WHERE (PlacementID = 12404)
SELECT *
FROM V_ImportedReadingDay2
WHERE (PlacementID = 12404)
Dies ist ein bekanntes Problem. Sie können das Problem googlen. Ich habe zwei Lösungen gefunden. Verwenden Sie entweder eine Tabellenwertfunktion oder verschieben Sie die LAG außerhalb der Ansicht.
ABER ich würde gerne wissen, ob es andere Lösungen gibt, da keine von diesen für mich arbeiten, da ich die Ansicht in einer Client-Software verwenden muss.
Ich weiß, wie ich schon sagte, sie sind vereinfacht. – Kvasi
Die gleiche Analyse gilt immer noch - in der direkten Abfrage gegen die Tabelle Groß- und Kleinschreibung, logisch * filter * und * dann * 'LAG', und in der Ansichtsabfrage sind Sie' LAG', bevor Sie filtern. Sie sind logisch noch verschiedene Abfragen. –
Nun ja, die LAG sollte in der Lage sein, aus einer Zeile zu holen, die nicht zum selben Filter passt, da der Wert zu einem Meter gehört, der von einem Platz zu einem anderen verschoben werden könnte, ohne den Lesewert zurückzusetzen. Obwohl ich erkannte, dass selbst wenn ein LAG-Wert korrekt zu einem früheren Placement gehören konnte, war es nicht sinnvoll. Also ja, du hast Recht, dass sie nicht gleich sind. – Kvasi