sqlserver怎么批量删除大量数据
工作库中有一个表记录日志信息,三个月数据量近8百万条,现想只保留一个月历史数据,每个月月初做上上个月的数据清除,所以删除表数据时需要有时间筛选条件,删除时需要锁表,求快速删除表数据方案。
参考网上资料后现自己想出来的方案:
1.分批删除
SET ROWCOUNT 100000;
WHILE 1 = 1
BEGIN
BEGIN TRAN
delete from table
where datediff(MM,tabletime,getdate())>1;
COMMIT
IF @@ROWCOUNT = 0
BREAK;
END
SET ROWCOUNT 0;
这个方法缺点也是很慢,很慢很慢。
2.将表数据抽取到临时表,truncate掉正式表(很快),再将临时表中有用数据抽取回正式表,整个过程包在事物中,这个方法不建议,因为锁表truncate后出错后,事物跳出,表数据可能也会清空 - -
求经常处理大数据的大神给个快速删除的方案。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
没有方案。对于已经产生的问题必然要花费额外的时间与精力去解决,所谓的方案只能对未来产生影响。
对于现有数据,时间字段应该被索引,这样就会比较快了,同时不要使用datediff(MM,tabletime,getdate())>1;这种条件,该条件会导致索引失效使执行效率降低,应该直接使用time > '2016-07-01 00:00:00.000',同时,你可以考虑分批处理。
保留最近一个月的日志通常不是很稳妥,至少也要保留一年的。鉴于数据量很大,可以考虑按周为单位创建多个表,通过逻辑循环创建,这样总是保持最近一年的记录,以后也不会出现类似的问题。
直接对表按照时间分区,然后每个月把之前表空间里面的数据移动出来