Question

Cette requête prend beaucoup de temps lorsque endDate est nul (je pense que son au sujet de la déclaration de cas, avant la déclaration de cas, il a été rapide)

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

Que dois-je utiliser, quand endDate est nulle pour le rendre plus rapide?

Était-ce utile?

La solution

Voici la requête sans CONVERT ou CASE:

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

Pour vous assurer Sql Server doens't évaluer getdate () pour chaque ligne, vous pouvez le mettre en cache, même si je suis assez sûr Sql Server est assez intelligent par défaut:

declare @now datetime
set @now = getdate()

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

Affichage du plan de requête pourrait aider à expliquer pourquoi la requête est lente:

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)

Autres conseils

Si c'est la performance critique, alors peut-être tout simplement ne pas utiliser pour l'ouverture null date de fin -. Utiliser le maximum pris en charge à la place datetime (probablement beaucoup de 9s)

Je voudrais aussi faire la conversion séparément:

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

SELECT * 
  FROM HastaKurumlari
WHERE @when
BETWEEN startDate AND endDate

Il y a encore quelque chose d'un peu différent dans ce qui précède et original; si vous pouvez expliquer le intention de vérifier que je pourrais GETDATE() pouvoir ranger (lire: fix) un peu

.

En tant que point de départ, factoriser GETDATE () de sorte que son appelé juste une fois, et vous devriez voir une amélioration de la vitesse.

La façon dont vous l'avez écrit vous demandez GETDATE () à évaluer chaque fois enddate est nulle.

Depuis GETDATE () est une non déterministe fonctionner la requête ne peut être optimisé et aura tendance à sous-performer.

Vous pouvez essayer soudent fonction:

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

La seule façon d'être certain est d'essayer d'autres solutions et voir le plan d'exécution généré pour chaque requête.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top