SQL Server:根据百万记录表中的数据重写WHERE子句

时间:2017-11-09 13:03:15

标签: sql sql-server

请参阅以下查询,该查询需要近10分钟才能运行。是否可以重写以更快地获取结果,主要是where子句条件......

记录数量:

  • 表tmp_TimeIntervals:1440
  • 表tmp_Activities:1299688

代码:

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))

此致

3 个答案:

答案 0 :(得分:0)

如果您正在使用任何框架,那么使用内置方法来获取块中的记录。

答案 1 :(得分:0)

如果您想在tmp_TimeIntervalstmp_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倍。