Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 日期范围理货表分组性能不佳_Sql_Sql Server 2008_Tsql_Stored Procedures_Group By - Fatal编程技术网

Sql 日期范围理货表分组性能不佳

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

我有一个存储过程,它当前对TempDb的影响非常大,使得查询运行速度很慢,有时会消耗大量磁盘空间(TempDb不断增长)。我收集的数据如下:

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