Sql 日期范围理货表分组性能不佳
我有一个存储过程,它当前对TempDb的影响非常大,使得查询运行速度很慢,有时会消耗大量磁盘空间(TempDb不断增长)。我收集的数据如下:Sql 日期范围理货表分组性能不佳,sql,sql-server-2008,tsql,stored-procedures,group-by,Sql,Sql Server 2008,Tsql,Stored Procedures,Group By,我有一个存储过程,它当前对TempDb的影响非常大,使得查询运行速度很慢,有时会消耗大量磁盘空间(TempDb不断增长)。我收集的数据如下: ID StartDate EndDate ----------- ----------------------- ----------------------- 1 2013-06-17 00:09:59.270 2013-09-25 00:09:59.270 2 201
ID StartDate EndDate
----------- ----------------------- -----------------------
1 2013-06-17 00:09:59.270 2013-09-25 00:09:59.270
2 2013-06-22 00:10:30.077 2013-07-22 00:10:30.077
并且需要根据项目(ID)、年份和月份对其进行分组,并根据源数据中的范围,记录每月的天数,希望最终得到以下结果(减去我的深夜计算错误):
今天,此计算是使用存储过程完成的,非常类似于以下过程:
INSERT INTO GroupedData
(
ID,
TheYear ,
TheMonth ,
NumberOfDays
)
SELECT ID,
YEAR(StartDate + v.number) AS TheYear,
MONTH(StartDate + v.number) AS TheMonth,
COUNT(*) AS NumberOfDays
FROM dbo.RawData
INNER JOIN
master..spt_values v ON v.type = 'P'
AND v.number <= DATEDIFF(d, StartDate, EndDate)
GROUP BY ID,
YEAR(StartDate + v.number),
MONTH(StartDate + v.number)
插入到GroupedData中
(
身份证件
当年,,
这个月,
天数
)
选择ID,
年份(起始日期+v.编号)作为年份,
月份(起始日期+v.编号)作为月份,
将(*)计为NumberOfDays
从dbo.RawData
内连接
master..spt_v.type上的v值='P'
和v.number试试这个
INSERT INTO GroupedData
(
ID,
TheYear ,
TheMonth ,
NumberOfDays
)
SELECT ID,
YEAR(StartDate) + v.number AS TheYear,
MONTH(StartDate) + v.number AS TheMonth,
COUNT(*) AS NumberOfDays
FROM dbo.RawData
INNER JOIN
master..spt_values v ON v.type = 'P'
AND v.number <= DATEDIFF(d, StartDate, EndDate)
GROUP BY ID,
YEAR(StartDate) + v.number,
MONTH(StartDate) + v.number
插入到GroupedData中
(
身份证件
当年,,
这个月,
天数
)
选择ID,
年份(起始日期)+v.编号为年份,
月份(起始日期)+v.编号为月份,
将(*)计为NumberOfDays
从dbo.RawData
内连接
master..spt_v.type上的v值='P'
v.number第一个问题是master
有2048个值,只够5.6年使用。你在浪费时间。第二个是聚合前的行数。如果每条记录的平均跨度为2000天,则得到100000*2000=200000000行。您可以尝试只生成月份,并根据边缘情况(第一个月和最后一个月)计算每月天数,而不是计算天数。这也将删除group by
。谢谢,是的,主控只是为了说明原理,我正在使用生成的“数字”表来处理实际代码中的2048限制。补充说明。
INSERT INTO GroupedData
(
ID,
TheYear ,
TheMonth ,
NumberOfDays
)
SELECT ID,
YEAR(StartDate) + v.number AS TheYear,
MONTH(StartDate) + v.number AS TheMonth,
COUNT(*) AS NumberOfDays
FROM dbo.RawData
INNER JOIN
master..spt_values v ON v.type = 'P'
AND v.number <= DATEDIFF(d, StartDate, EndDate)
GROUP BY ID,
YEAR(StartDate) + v.number,
MONTH(StartDate) + v.number