sqlserver怎么批量删除大量数据

发布于 2022-09-03 09:25:49 字数 537 浏览 16 评论 0

工作库中有一个表记录日志信息,三个月数据量近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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

窝囊感情。 2022-09-10 09:25:49

没有方案。对于已经产生的问题必然要花费额外的时间与精力去解决,所谓的方案只能对未来产生影响。

对于现有数据,时间字段应该被索引,这样就会比较快了,同时不要使用datediff(MM,tabletime,getdate())>1;这种条件,该条件会导致索引失效使执行效率降低,应该直接使用time > '2016-07-01 00:00:00.000',同时,你可以考虑分批处理。

保留最近一个月的日志通常不是很稳妥,至少也要保留一年的。鉴于数据量很大,可以考虑按周为单位创建多个表,通过逻辑循环创建,这样总是保持最近一年的记录,以后也不会出现类似的问题。

热血少△年 2022-09-10 09:25:49

直接对表按照时间分区,然后每个月把之前表空间里面的数据移动出来

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文