日期:2014-05-18  浏览次数:20633 次

关于运行存储过程 导致temp数据库增加,运算停止的问题。
存储过程运行中包含一个游标运算,每次运行3小时左右会把磁盘空间占满,然后停止运算。temp数据库占用空间会很大。如何在运算同时,减少temp数据库所占空间。


或者提供一个新的计算方式。比如表为如下结构
日期 平台 服务器 收入 30天内的收入
20120612 2 20 20
20120512 3 1 300
最后一个数据项的值,是对应日期往前推30天内的所有收入总和。如上图20120612这条数据,要计算的是2号平台,20服务器,从201205013到20120612所有收入的之和。请问sql语句怎么写。表的数据量比较大,有2000多万。

------解决方案--------------------
SQL code

select 日期,平台,服务器,收入,
(select sum(收入) from test b 
where a.平台=b.平台 and a.服务器=b.服务器 
and DATEDIFF(DD,b.日期,a.日期)<=30) as [30天内的收入]
from test a

------解决方案--------------------
探讨

游标不是死循环,因为之前曾经运行完毕,个人感觉是临时数据太大,导致的空间不够使用。感谢2楼给的提示,我想补充下,如果是2个表,a表中的字段和上述一样,b表中字段没有[30天收入],但是有一个用户字段.这样的话,语句该怎么写,把b表的收入汇总更新到a表的[30天收入中]

------解决方案--------------------
上面已经有很多方法,再补充一些:
1、尽早删除已经没用的临时表,因为我看到很多人都是在存储过程的最后才一起删除,而其实大部分在中间的时候已经完成了它的生命周期。
2、大部分程序其实到了最后结果才需要关联所有相关数据,在中间过程,尽量使用主键就好了。不要一开始就关联那么多数据,我优化过一个报表程序,它一开始就把基本上最后展示的结果查出来放到临时表,过程用到的临时表就有7000M,一个程序整整运行了40分钟才出来60000多数据。然后我只把主键保留,到最后展示的时候才关联出来,结果36秒就出来了。
3、越到高级版本的SQL Server,对tempdb的使用越频繁,所以还是建议把tempdb扩大,微软的建议是把tempdb的数据文件拆分成与CPU一样多(当然如果几十个CPU就没必要拆那么多,10个数据文件就差不多了),然后把tempdb的初始值设成合理范围,比如我的服务器是2G,限定大小4G每个文件。因为tempdb增长会导致I/O瓶颈。另外tempdb尽量放到读写快的磁盘,如果有磁盘阵列,可以考虑放到RAID 0。