我在SQL Server2005中有一个查询,其中2个日期字段进行比较。如果我不包含时间并仅使用日期部分进行比较,则查询运行速度很快(以毫秒为单位)。但是,我需要将时间与日期部分进行比较。如果我包含时间部分,查询运行速度非常慢,并最终返回连接超时错误。SQL服务器日期时间比较花费时间来执行
`((startdate1 >= @startdate2 and enddate1 <= @enddate2) or
(startdate1 <= @startdate2 and enddate1 >= @startdate2 and enddate1 <= @enddate2) or
(startdate1 >= @startdate2 and startdate1 < @enddate2 and enddate1 > @enddate2) or
(startdate1 < @startdate2 and enddate1 > @enddate2))`
这部分查询花了很多时间来执行。但是,如果我将查询更改为以下格式,查询运行速度非常快。
((cast(CONVERT(VARCHAR(10),startdate1,101) as datetime) >= cast(CONVERT(VARCHAR(10),@startdate2,101) as datetime)
AND cast(CONVERT(VARCHAR(10),enddate1,101) as datetime)<= cast(CONVERT(VARCHAR(10),@enddate2,101) as datetime)) OR
(cast(CONVERT(VARCHAR(10),startdate1,101) as datetime) <= cast(CONVERT(VARCHAR(10),@startdate2,101) as datetime)
AND ((cast(CONVERT(VARCHAR(10),enddate1,101) as datetime) >= cast(CONVERT(VARCHAR(10),@startdate2,101) as datetime))
AND (cast(CONVERT(VARCHAR(10),enddate1,101) as datetime) <= cast(CONVERT(VARCHAR(10),@enddate2,101) as datetime) ))) OR
(cast(CONVERT(VARCHAR(10),startdate1,101) as datetime) >= cast(CONVERT(VARCHAR(10),@startdate2,101) as datetime) and
((cast(CONVERT(VARCHAR(10),startdate1,101) as datetime) < cast(CONVERT(VARCHAR(10),@enddate2,101) as datetime)) AND
(cast(CONVERT(VARCHAR(10),enddate1,101) as datetime) > cast(CONVERT(VARCHAR(10),@enddate2,101) as datetime) ))) OR
(cast(CONVERT(VARCHAR(10),startdate1,101) as datetime) < cast(CONVERT(VARCHAR(10),@startdate2,101) as datetime) and
cast(CONVERT(VARCHAR(10),enddate1,101) as datetime) > cast(CONVERT(VARCHAR(10),@enddate2,101) as datetime)))
请给我建议一些想法。在此先感谢...
......没有意义。针对列的所有这些转换应排除任何潜在的索引使用情况,而第一个查询应能够使用索引(如果存在)。你对这些列有任何有用的索引吗? – 2012-03-14 10:50:40
对第一种情况缓存错误的查询计划?使用fullscan运行'更新统计信息'(这应该刷新缓存并重新计算统计信息)并重试。 – Arvo 2012-03-14 10:51:34
如何使用fullscan在yourtable上运行'更新统计信息' – ASD 2012-03-14 11:10:58