【问题标题】:Comparing dates using between results slow performance在结果之间比较日期会降低性能
【发布时间】:2017-02-15 12:30:47
【问题描述】:

我在查询的where 子句中使用了下一个条件:

CONVERT(INT, CONVERT(VARCHAR(10), DA.ACCESS_DATE, 112))  
        > = CONVERT(INT, CONVERT(VARCHAR(10), CCM.START_DATE, 112))
AND 
CONVERT(INT, CONVERT(VARCHAR(10), DA.ACCESS_DATE, 112)) 
        < ISNULL(convert(int, convert(varchar(10), CCM.[END_DATE], 112)), 20161001) 

使用上述条件运行查询时,需要花费大量时间才能返回输出。

有什么方法可以更快地得到结果?

【问题讨论】:

标签: sql sql-server sql-server-2008 msbi


【解决方案1】:

对不起?为什么要将日期转换为其他类型进行比较?如果日期没有时间组件,那么您可以这样做:

DA.ACCESS_DATE >= CCM.START_DATE AND
DA.ACCESS_DATE < COALESCE(CCM.[END_DATE], '20161001') 

如果日期确实有时间组件并且您想忽略它们,那么您应该转换为date,但只是删除时间组件。

我应该指出,这可能不会提高性能。这个版本有机会利用可用的索引——如果它们合适的话。使用索引可以加快查询速度。

【讨论】:

  • DA.ACCESS_DATE 是 Datetime 类型,START_DATE 和 END_DATE 是 Date
  • 我是否需要在两个表上都包含索引,如果需要,那么哪个索引聚集或非聚集?
  • @AnkurJain 。 . .如果您有关于索引的问题,您应该问另一个 问题并包含查询(或它的简化版本)。但是,对于这个查询,您应该尝试在 da(access_date)ccm(start_date, end_date) 上建立索引。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-25
  • 1970-01-01
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
  • 2015-07-01
  • 2018-12-12
相关资源
最近更新 更多