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
问问题
105 次
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 回答