请参阅以下查询,该查询需要近10分钟才能运行。是否可以重写以更快地获取结果,主要是where子句条件......
记录数量:
代码:
select
i.ID,
sl.SPID,
i.PeriodStart,
DATEDIFF(mi, i.PeriodStartUTC, sl.ENDTIME)
from
tmp_TimeIntervals i
join
tmp_Activities sl on (sl.StartTime <= i.PeriodStartUTC
and (sl.Endtime > i.PeriodStartUTC
and sl.Endtime < PeriodEndUTC))
此致
答案 0 :(得分:0)
如果您正在使用任何框架,那么使用内置方法来获取块中的记录。
答案 1 :(得分:0)
如果您想在tmp_TimeIntervals
和tmp_Activities
中重叠间隔,则SQL查询可能如下所示:
select
i.ID,
sl.SPID,
i.PeriodStart,
DATEDIFF(mi, i.PeriodStartUTC, sl.ENDTIME)
from tmp_TimeIntervals i
join tmp_Activities sl
on sl.StartTime <= i.PeriodEndUTC and sl.Endtime > i.PeriodStartUTC
对于高效运行,你肯定需要索引tmp_Activities(StartTime , Endtime, SPID)
。如果SPID
是聚簇索引的键,则可以将其删除。
create index ix_tmp_Activities on tmp_Activities(StartTime , Endtime) include (SPID)
另一个索引tmp_TimeIntervals(PeriodEndUTC, PeriodStartUTC, PeriodStart, ID)
也很有帮助,因为SQL Server可以更轻松地使用合并连接。如果它是聚簇索引的键,则可以再次从索引中删除ID
。
create index ix_tmp_TimeIntervals on tmp_TimeIntervals(PeriodEndUTC, PeriodStartUTC) include (PeriodStart, ID)
答案 2 :(得分:0)
一些事情 最好检查一下估计的执行计划并检查咀嚼的成本。
尝试并放置一个左外连接,因为它将创建一个子查询,它比你的内连接更快。 因为这个概念是推下谓词。
创建索引检查列长度之前的另一个colnsideration。如果数据写入不频繁,则考虑生成列存储索引将比现在获得的速度快10倍。