Auswahl von "aktueller" Zeile (bis zu einem date) aus einer Tabelle (Sql server 2008)

Ich habe ein paar gespeicherte Prozeduren nach dem Muster der Auswahl der Zeile, für die eine date Spalte ist die neuesten bis zu einem bestimmten date, inklusive. Ich sehe zwei forms im deployment:

select top 1 x, y, z from sometable where a=b and date <= @date order by date desc 

oder

 select x, y, z from sometable where a=b and date=(select max(date) from sometable where a=b and date <= @date) 

Ich kann mir eine Ableitung der zweiten Form vorstellen, die eine Verknüpfung anstelle einer Unterabfrage verwendet.

Wir können den Fall ignorieren, wo die zweite Form mehrere Zeilen zurückgeben kann. Angenommen, es wird nie.

Da dies in vielen Orten verwendet wird, von denen einige gegen eine große Anzahl von Zeilen in Performance-kritischen Code, möchte ich standardisieren, je nachdem, was ist die optimale Lösung (was kann ein anderer Vorschlag sein).

Einige googeln haben zahlreiche Vergleiche von TOP 1 vs MAX, aber in der Regel für einen einzigen Wert, und keine Unterabfrage. In diesem Fall ist MAX der klare Sieger, aber ich bin mir nicht sicher, ob die Unterabfrage das ändert.

Ich würde schätzen die viewen von denen mehr kenntnisreich als ich in diesem Bereich (was sollte die meisten von euch!).

Ihre Ergebnisse können je nach Tabellengestaltung variieren, aber im Allgemeinen ist die TOP 1 / Order by Technik 2 mal besser, wenn es keinen Index auf date gibt, da SQL server einen Scan für jede Abfrage durchführen muss – zuerst das max date zu finden, dann den Rest der Werte auf der Grundlage davon zu sehen. Wenn es einen Index auf date gibt (ob es die Abfrage abdeckt oder nicht), ist der Plan der gleiche.

Das Wichtigste, was hier zu beachten ist, ist die Indizierung. Wenn diese Abfrage viel ausgeführt werden soll, solltest du sicherstellen, dass du das datesfeld indexierst.

Sowohl aus der Sicht der TOP 1, die unter bestimmten Umständen optimal ist, und die Frage, die Sie bereits berührt haben: Der MAX könnte mehr als eine Zeile zurückkehren (nicht davon ausgehen, dass es nicht irgendwann, übrigens, es sei denn, es gibt einen eindeutigen Index am date), ich bevorzuge definitiv die TOP 1 Technik – es ist die Technik, die ich für alle diese Abfragen verwende.

Der Abfrageoptimierer hat viel Freiheit und kann sowohl MAX als auch TOP 1 auf verschiedene Weise ausführen. Genau das, was es tut, hängt von der Quellenabfrage, den verfügbaren Indizes und den Statistiken für Ihren Tisch ab. Morgen könnte es eine andere appreach wählen, da die Größe Ihres Tisches oder seine Verteilung ändern.

Also ich glaube nicht, dass es eine optimale Lösung gibt. Warten auf aktuelle performancesprobleme und optimieren sie nacheinander.