【发布时间】:2012-03-30 19:18:32
【问题描述】:
我在 SQL Server2005 中有一个查询,其中比较了 2 个日期字段。如果我不包括时间并且只使用日期部分进行比较,那么查询运行速度很快(以毫秒为单位)。但是,我还需要将时间与日期部分进行比较。如果我包含时间部分,则查询运行速度非常慢,最后返回连接超时错误。
`((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) ))
请给我一些建议。提前致谢...
【问题讨论】:
-
那……没有意义。所有这些针对列的转换都应该排除任何潜在的索引使用,而第一个查询应该能够使用索引(如果它们存在)。您对这些列有任何有用的索引吗?
-
第一种情况缓存的查询计划错误?运行“使用全扫描更新您的表上的统计信息”(这应该刷新缓存并重新计算统计信息)并重试。
-
如何运行“使用全扫描更新您的表上的统计信息”
-
此查询在存储过程中需要时间,但是当我将其作为单独的查询执行时,它只花费了几分之一秒。知道为什么它只在存储过程中花费时间并作为独立查询快速运行
标签: performance sql-server-2005 datetime comparison