【发布时间】:2017-01-10 23:58:14
【问题描述】:
我有一个表,其中包含在 WHERE 子句中使用的列 dt,以及在连接中使用的另一列 identifier。 dt 和 identifier 都已编入索引。
对于今天之前的所有日期,下面的查询运行时间不到一秒:
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