Frage

Diese Abfrage lange dauert, wenn endDate null ist (ich glaube, dass seine über case-Anweisung, bevor case-Anweisung es schnell war)

SELECT * 
FROM HastaKurumlari
WHERE CONVERT(SMALLDATETIME,'21-05-2009',103) 
BETWEEN startDate 
    AND (CASE WHEN endDate IS NULL THEN GETDATE() ELSE endDate END) 

Was soll ich verwenden, wenn endDate null ist es schneller zu machen?

War es hilfreich?

Lösung

Hier ist die Abfrage, ohne CONVERT oder CASE:

SELECT * 
FROM HastaKurumlari
WHERE '21-05-2009' between startDate and IsNull(endDate,getdate())

Um sicherzustellen, dass SQL Server doens't bewerten getdate () für jede Zeile zu machen, können Sie es zwischenspeichern konnte, obwohl ich ziemlich sicher bin, SQL Server standardmäßig intelligent genug ist:

declare @now datetime
set @now = getdate()

SELECT * 
FROM HastaKurumlari
WHERE '21-05-2009' between startDate and IsNull(endDate,@now)

Buchung der Abfrage-Plan könnte erklären, warum die Abfrage langsam ist:

SET SHOWPLAN_TEXT ON
go
SELECT * 
FROM HastaKurumlari
WHERE CONVERT(SMALLDATETIME,'21-05-2009',103) 
BETWEEN startDate 
    AND (CASE WHEN endDate IS NULL THEN GETDATE() ELSE endDate END)

Andere Tipps

Wenn es die Leistung entscheidend ist, dann vielleicht einfach nicht null für das offene Ende-Datum verwenden -. Die maximale Datumzeit statt unterstützt verwenden (wahrscheinlich viele 9s)

Ich würde auch die Umwandlung tut getrennt:

DECLARE @when datetime
SET @when = CONVERT(SMALLDATETIME,'21-05-2009',103) 

SELECT * 
  FROM HastaKurumlari
WHERE @when
BETWEEN startDate AND endDate

Es gibt immer noch etwas ein bisschen anders in der oben und die Original; wenn Sie die Absicht der GETDATE() Prüfung können erklären könnte ich in der Lage sein (sprich: fix) ordentlich es ein bisschen

.

Als Ausgangspunkt, ausklammern GETDATE (), so dass sie nur einmal aufgerufen, und Sie sollen eine Verbesserung der Geschwindigkeit sehen.

So wie du es geschrieben hast du für GETDATE fragen () jedes Mal enddate ist null bewertet werden.

Da GETDATE () ist ein nicht-deterministische funktioniert die Abfrage nicht optimiert werden kann und ist in der Regel unter zuführen.

Sie könnten versuchen, die coalesce Funktion:

select * 
from HastaKurumlari
where convert(smalldatetime, '21-05-2009', 103) 
    between startDate and coalesce(endDate, getdate());

Die einzige Möglichkeit, sicher zu sein, ist keine Alternativen zu versuchen und den Ausführungsplan für jede Abfrage erzeugt anzuzeigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top