SqlServer每天表执行大量先删除再插入操作,表实际占用空间变得特别大,怎么回事?

lxljw1314 2014-12-18 10:07:39
SqlServer2008 R2,每天有定时作业调度,主要是对表进行删除再插入新数据,比如a表今天先删除前两月的数据,大概600w,然后再插入前两月至今的数据,大概610w左右,可能一天实际多出10几万的数据量吧,但是我看统计信息,a表实际占用的空间变化,增长了1个多G,10几万的记录数增长,能有1个多G ??不可能吧。。。是不是在对表进行删除插入的操作过程中,有什么占用空间的呢?建了个聚集索引,也只有上百兆而已,真不知道为什么?如果这张表每天都增长1个g,那多大的磁盘也不够啊。。。求知道的大神指点下,拜托了。。。
...全文
1010 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
發糞塗牆 2014-12-19
  • 打赏
  • 举报
回复
空间是不会自动回收的,而且delete操作先把数据标识为ghostrecord,由后台进程定时处理,当你刚删完马上插入时,后台进程并没有马上移除这些数据,所以需要分配额外的空间来存储新增的数据,频繁操作之后,空间就越来越大,可以考虑定时重建聚集索引。
cy2889792 2014-12-19
  • 打赏
  • 举报
回复
DELETE 语句 就相当于把数据放入回收站一样,数据实际上还是在数据库里, 如果你是整个表的数据都删了,建议你使用 TURNCATE TABLE 表名, 这样就可以永久的把数据清空,且删除的速度比DELETE FROM 快多了。
Tiger_Zhao 2014-12-19
  • 打赏
  • 举报
回复
每天都算两个月,那么今天和昨天不是有大部分结果是一样的?
lxljw1314 2014-12-19
  • 打赏
  • 举报
回复
感谢版主指点,原来是这样。。。因为业务需求,目前都是做删除再立即插入的操作,看来只有定期重建聚集索引了! 对了,现在我只给几个特别大的表建了索引,有必要给所有的表都建索引么。。。我知道有索引可以提升查询速度但是要付出空间代价,但我这些表不是业务表,不会直接查询,都是用来做统计汇总的,是要放到多位数据库里供前端报表使用的
pursuer_chen 2014-12-18
  • 打赏
  • 举报
回复
那是因为你之前删除的数据空间没有被回收,你后面新增的数据并不是补充到之前删除的里面去,而是分配的另外空间,你可以重新生存索引再收缩。

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧