【问题标题】:Sql server Datetime comparison is taking time to executeSql server 日期时间比较需要时间来执行
【发布时间】: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


【解决方案1】:

你试过DateDiff函数吗?

【讨论】:

  • 是的..尝试过..这也需要时间来执行。代码 sn-p 是: ((datediff(mm,@startdate2,startdate1)>=0 和 datediff(mm,@enddate2,enddate1)=0 和 datediff(mm,@enddate2,enddate1)=0 和 datediff(mm,@enddate2,startdate1)0) 或 (datediff(mm,@startdate2,startdate1)0))
  • 表中只有10条记录,执行时间超过20分钟
  • 这没有意义,你定义这些变量的类型是什么?你能在你的过程中粘贴更多代码
猜你喜欢
  • 2016-09-19
  • 1970-01-01
  • 2013-06-28
  • 2012-06-08
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 2018-07-29
相关资源
最近更新 更多