「たstartDateとNULLの間paramDate」:どのように速く、この声明を作るには?

StackOverflow https://stackoverflow.com/questions/847750

  •  21-08-2019
  •  | 
  •  

質問

endDateにはnullの場合、このクエリは、長い時間がかかっている(私はそのcase文について、case文の前にそれが速かったと思います)。

SELECT * 
FROM HastaKurumlari
WHERE CONVERT(SMALLDATETIME,'21-05-2009',103) 
BETWEEN startDate 
    AND (CASE WHEN endDate IS NULL THEN GETDATE() ELSE endDate END) 
endDateには、より速くそれを作るためにnullであるとき、

私は、何を使うべきでしょうか?

役に立ちましたか?

解決

ここでCONVERTまたはCASEのないクエリがあります:

SELECT * 
FROM HastaKurumlari
WHERE '21-05-2009' between startDate and IsNull(endDate,getdate())
私は、SQL Serverは、デフォルトでは十分にスマートであるかなり確信しているが、

SQL Serverが(GETDATEを評価doens'tを確認するには)行ごとに、あなたは、それをキャッシュできます:

declare @now datetime
set @now = getdate()

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

クエリプランは、クエリが遅い理由を説明するのに役立つ可能性がポスティングます:

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)

他のヒント

それは、パフォーマンスが重要であるならば、おそらくちょうどオープンエンド日付のnullを使用していない - 。代わりのdatetimeサポートされる最大(9Sのおそらく多くを)使用

私も別途変換を行うと思います:

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

SELECT * 
  FROM HastaKurumlari
WHERE @when
BETWEEN startDate AND endDate

上記と元のビット別の何かがまだあります。あなたはGETDATE()チェックのの意思を説明できるかどうかは整理することができるかもしれません(読み:修正を)それビット

出発点として、その一度だけ呼ばれるように、GETDATE()をくくり出す、とあなたは速度の向上を確認する必要があります。

あなたは終了日がnullのたびに評価される)(GETDATEを求めていることを書いた

道ます。

GETDATE()があるので非決定論クエリを最適化することができないと実行の下に傾向があります機能します。

あなたは の機能を合体します:

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

特定可能にする唯一の方法は、いずれかの選択肢を試してみて、各クエリのために生成された実行計画を表示することです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top