如何更快这一说法:“paramDate的startDate和NULL之间”?
-
21-08-2019 - |
题
该查询花费很长一段时间时,结束日期为空(我认为其对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)
我应该使用什么,何时结束日期为空,使其更快?
解决方案
这里的无转换或CASE查询:
SELECT *
FROM HastaKurumlari
WHERE '21-05-2009' between startDate and IsNull(endDate,getdate())
要确保SQL Server好好尝试一下评估每一行GETDATE(),你可以缓存,虽然我敢肯定将SQL Server足够聪明,默认为:
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
为开放结束日期 - 使用日期时间,而不是支持最大(可能很多787-9的)
我还分别进行转换:
DECLARE @when datetime
SET @when = CONVERT(SMALLDATETIME,'21-05-2009',103)
SELECT *
FROM HastaKurumlari
WHERE @when
BETWEEN startDate AND endDate
还有一些在上面和原来的有点不同;如果你能解释的意图的的GETDATE()
检查我也许能整理(读:修复)有点
作为一个起点
,分解出GETDATE(),因此其所谓的只有一次,你应该看到在速度的提高。
您已经写它,你所要求的GETDATE()来进行评估,每次结束日期为空的方式。
由于GETDATE()是一个非确定性功能不能被优化查询并且将趋于下进行。
您可以尝试 COALESCE 功能:
select *
from HastaKurumlari
where convert(smalldatetime, '21-05-2009', 103)
between startDate and coalesce(endDate, getdate());
为一定的唯一方法是尝试任何替代和查看每个查询生成的执行计划。
不隶属于 StackOverflow