「たstartDateとNULLの間paramDate」:どのように速く、この声明を作るには?
-
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()があるので非決定論>クエリを最適化することができないと実行の下に傾向があります機能します。
所属していません StackOverflow