【问题标题】:SQL Server date index lagging by one daySQL Server 日期索引滞后一天
【发布时间】:2017-01-10 23:58:14
【问题描述】:

我有一个表,其中包含在 WHERE 子句中使用的列 dt,以及在连接中使用的另一列 identifierdtidentifier 都已编入索引。

对于今天之前的所有日期,下面的查询运行时间不到一秒:

select SRDtoday.*
from SRD as SRDtoday
left join (select * from SRD where convert(date, dt) = convert(date, dateadd(day, -1, getdate()))) as SRDyesterday ON (SRDtoday.Identifier = SRDyesterday.Identifier)
where convert(date, SRDtoday.dt) = convert(date, dateadd(day, -1, getdate()))

但是,当我今天运行它时,大约需要 15 分钟:

select SRDtoday.*
from SRD as SRDtoday
left join (select * from SRD where convert(date, dt) = convert(date, getdate())) as SRDyesterday ON (SRDtoday.Identifier = SRDyesterday.Identifier)
where convert(date, SRDtoday.dt) = convert(date, getdate())

当我查看执行计划时,它看起来像在今天之前它正在执行索引搜索,但是当我在查询中使用今天时,它正在执行索引扫描

我已尝试删除并重建索引,但这无济于事。有什么想法吗?

【问题讨论】:

  • 左连接有什么意义?你似乎没有将它用于任何事情。
  • dt 列是什么数据类型?
  • 对不起,我稍微清理了查询并剥离了使用连接的选择(它确实被使用了)。
  • dt 字段是日期时间

标签: sql-server tsql indexing


【解决方案1】:

您应该避免将强制转换/转换或任何动态应用到整个列。当您这样做时,无论是否需要,SQL 都必须将转换应用于每一行,然后才能检查相等/不等式。通常这会导致索引没有被使用,或者没有被正确使用。

更好的方法是更改​​条件以适应数据类型,而不是更改数据类型以适应条件。

Ex 而不是

WHERE CONVERT(DATE, DT) = '2016-09-02'

你可以这样做:

WHERE DT >= '2016-09-02' AND DT < '2016-09-03'

也就是说,这是我建议的更改:

declare @myDate DATETIME
set @myDate = convert(datetime,convert(date,getdate()))


select SRDtoday.*
from SRD as SRDtoday
left join (select * 
           from SRD 
           where dt >= @myDate and dt < DATEADD(DD,1,@myDate)) as SRDyesterday 
   ON (SRDtoday.Identifier = SRDyesterday.Identifier)
where SRDtoday.dt >= @myDate and SRDtoday.dt < DATEADD(DD,1,@myDate)

【讨论】:

    猜你喜欢
    • 2010-12-19
    • 2021-09-13
    • 1970-01-01
    • 2010-11-09
    • 2014-02-05
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多