ich eine Abfrage übergeben wurde, die vier Versionen dieser Abfrage in der select-Klausel oben hatWie kann ich die MM/DD, die samstags für die letzten 30 Tage waren
SELECT
STUFF((SELECT DISTINCT '; ' +
LEFT(CONVERT(VARCHAR, CAST(ADT2.EffectiveDTS AS DATE),101), 5)
FROM ADT AS ADT2
WHERE
DATENAME(dw, ADT2.EffectiveDTS) = 'Saturday' AND
CAST(ADT2.EffectiveDTS AS DATE) BETWEEN DATEADD(D, -30, CAST(ADT.EffectiveDTS AS DATE)) AND
CAST(ADT.EffectiveDTS AS DATE) FOR XML PATH('')), 1, 1,'')) AS Saturdays,
Diese besondere Abfrage spuckt diese 10/08
; 10/29
; 10/15
; 10/22
in die SAMSTAGS Spalte.
Mein erster Schritt war es, eine Kalender-Tabelle in die JOIN-Verbindung zu bringen.
INNER JOIN Reference.Calendar CAL
ON CAL.CalendarDTS = CAST(ADT.EffectiveDTS AS DATE)
Ich war nicht sicher, ob das Datetime-Feld Gießen effizient wäre aber mit einem Index zum Zeitpunkt der Abfrage von 35 Sekunden bis 1 für 18K Reihen fallen gelassen, die sechs Tage der Daten ist.
Ich war überrascht über diese Verbesserung, aber dann lief ich es zurück bis Januar 2015. Das veranlasste mich, die Abfrage nach etwa 10 Minuten zu töten. Ich weiß, dass diese oberen Select-Anweisungen Probleme verursachen, mein Ausführungsplan ist abscheulich.
So jetzt versuche ich über den besten Weg nachzudenken, diese Abfragen zu ersetzen. Zu Ihrer Information: Ich bin aufgrund des Tools, das meine Firma verwendet, darauf beschränkt, eine Ansicht zu verwenden. Sonst bin ich mir sicher, dass ich viel besser mit einem Proc umgehen könnte.
Was ist der Datentyp für EffectiveDTS? es als ein Datum zu werfen ist wahrscheinlich Teil dessen, was Ihre Abfrage – DForck42
tötet Es ist ein DateTime2-Feld. Ich habe es als DATUM gecastet, um mich meinem Kalendertisch anzuschließen. Das hat die Abfrage von 37 Sekunden auf 2 heruntergezählt. Ich muss noch das Kalenderdatum in die Selects setzen, die in der Hauptauswahl ausgeführt werden. Ich nahm nur an, dass es einen besseren Weg dafür gibt. –