该查询花费很长一段时间时,结束日期为空(我认为其对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());

为一定的唯一方法是尝试任何替代和查看每个查询生成的执行计划。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top