2

源表

CREATE TABLE #TEMPTABLE
(
     requestTime datetime2,
     NoOfSessions integer

)

INSERT INTO #TEMPTABLE
select  convert(nvarchar(16), TimeLog, 120) requestTime , COUNT(DISTINCT SessionId)As NoOfSessions
from  LogData
group by convert(nvarchar(16), TimeLog, 120) order by requestTime;


select  s1.requestTime
,       (
        select  sum(NoOfSessions)
        from    #TEMPTABLE s2
        where   dateadd(minute, -15, s1.requestTime) < s2.requestTime
                and s2.requestTime <= s1.requestTime
        ) as TotalNumberOfSessions
from    #TEMPTABLE s1


DROP TABLE #TEMPTABLE
4

4 回答 4

1

试试这个,让我知道。这可能对你有一些改进。我在临时表中添加了一个主键requestTime,可以在相关子查询中使用。

create table #TEMPTABLE
(
  requestTime smalldatetime primary key,
  NoOfSessions integer
)

insert into #TEMPTABLE
select dateadd(minute, datediff(minute, 0, TimeLog), 0), 
       count(distinct SessionId)
from  LogData
group by dateadd(minute, datediff(minute, 0, TimeLog), 0)


select  s1.requestTime
,       (
        select  sum(NoOfSessions)
        from    #TEMPTABLE s2
        where   dateadd(minute, -15, s1.requestTime) < s2.requestTime
                and s2.requestTime <= s1.requestTime
        ) as TotalNumberOfSessions
from    #TEMPTABLE s1

drop table #TEMPTABLE
于 2012-06-15T12:37:52.890 回答
0
  • 删除 TempTable 并在 ONE select 中完成所有操作。这完全意味着您可以更快地获得第一个结果 - 在您的情况下,SQL Server 可以在第二次选择发生之前不提供一行。
  • 尽量避免转换。你为什么首先转换?
  • 检查查询计划。您没有告诉我们有关索引以及为什么您认为它很慢的任何信息 - 此处的更多信息可能有助于答案。

一般来说,问题可能是这样的:

其中 dateadd(minute, -15, s1.requestTime) < s2.requestTime

我不确定这是否会导致有效的查询计划 - 但是您没有向我们展示该计划。

于 2012-06-15T12:19:59.490 回答
0

临时表不是问题。问题是相关的子查询导致了疯狂的循环连接迭代次数。

尝试将子查询重新构造为连接。将日期时间值四舍五入到分钟并加入分钟值。

于 2012-06-15T13:00:30.117 回答
0

我不认为临时表是问题,但这是没有它的代码:

select  s1.requestTime
,   (
    select  sum(NoOfSessions)
    from
    (
        select dateadd(minute, datediff(minute, 0, TimeLog), 0), 
            count(distinct SessionId)
        from  LogData
        group by dateadd(minute, datediff(minute, 0, TimeLog), 0)
    ) s2
    where   dateadd(minute, -15, s1.requestTime) < s2.requestTime
            and s2.requestTime <= s1.requestTime
    ) as TotalNumberOfSessions
from 
(
    select dateadd(minute, datediff(minute, 0, TimeLog), 0), 
        count(distinct SessionId)
    from  LogData
    group by dateadd(minute, datediff(minute, 0, TimeLog), 0)
) s1
于 2012-06-15T13:07:03.613 回答