2

当 endDate 为空时,此查询需要很长时间(我认为它是关于 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 以使其更快时,我应该使用什么?

4

4 回答 4

1

您可以尝试合并功能:

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

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

于 2009-05-11T11:50:46.513 回答
1

如果它对性能至关重要,那么也许只是不要null用于开放结束日期 - 使用最大支持的日期时间(可能很多 9s)。

我也会单独进行转换:

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

SELECT * 
  FROM HastaKurumlari
WHERE @when
BETWEEN startDate AND endDate

上面的内容和您的原始内容仍有一些不同;如果您能解释检查的意图GETDATE()我可能会稍微整理(阅读:修复)它。

于 2009-05-11T11:51:30.710 回答
1

这是没有 CONVERT 或 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)
于 2009-05-11T12:06:37.997 回答
1

作为起点,将 GETDATE() 分解为只调用一次,您应该会看到速度有所提高。

您编写它的方式是在每次 enddate 为空时要求对 GETDATE() 进行评估。

由于 GETDATE() 是一个非确定性函数,因此无法优化查询,并且往往会表现不佳。

于 2009-05-11T12:14:46.960 回答