惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
爱范儿
爱范儿
H
Help Net Security
V
Visual Studio Blog
J
Java Code Geeks
Stack Overflow Blog
Stack Overflow Blog
Microsoft Security Blog
Microsoft Security Blog
Apple Machine Learning Research
Apple Machine Learning Research
MyScale Blog
MyScale Blog
The Cloudflare Blog
Martin Fowler
Martin Fowler
D
Docker
腾讯CDC
F
Fortinet All Blogs
雷峰网
雷峰网
GbyAI
GbyAI
G
Google Developers Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Blog — PlanetScale
Blog — PlanetScale
Engineering at Meta
Engineering at Meta
博客园 - 聂微东
博客园 - 叶小钗

博客园 - 刚说

高效批量计量单位转换 层次结构计量单位数据库设计以及组内组间转换率 不同计价方式对存货核算的影响 .net操纵xml文件类(c#) WebWagon - An HTML Container Class asp.net1.1和asp.net 2.0共存 不敢相信吧!很灵的缘分配对软件! 免费动态网站空间申请(asp and asp.net and access or other)----(最新更新)收藏 哪位大虾给我找一个反编译工具 ASP遗留的二十大积习 Microsoft Visual Studio .NET 2005的更新 Windows死机密码 网站测试的郁闷 为Blog打造个性日历 XP安装全攻略---------(个性化) 看看C# 给asp.net 一个礼物 XP命令集 换换鼠标→看看怎么样
大数据量删除算法
刚说 · 2010-11-20 · via 博客园 - 刚说

大数据量删除算法

Posted on 2010-11-20 11:02  刚说  阅读(676)  评论()    收藏  举报

开门见山,直接进入主题,数据量在百万级已下,可以不看下边内容。

起因:

  某客户今年上了U9不久,随着业务量的增加,每日业务达2000多单据。由于客户操作业务有误,把业务做到了2018年底,之后才发现输入有误。在U9系统中,为了报表或是查询数据方便,随着业务的增减会按期间自动产生一些统计数据(至少18*12个期间的数据)两千万条数据,经过分析,客户不存在提前做业务场景,这些数据在系统中也就成了冗余数据,这数据占正常业务数据的90%。而随着业务的发生,自动按期间往后去更新各期间数据,每次更新的时候,数据库会自动优化锁,由行锁升级成页锁,再升级为表锁。表锁后这样可能导致数据操作等待排队现象。多业务操作,系统无法运行。这样就引出了,要删除这90%多的数据问题。

抽象:

  删除数据本应该是一个再简单不过的操作,在SQL中,我们可以用如下脚本:

Delete From AA Where Period>100

  其实,应该区分应用场景

  •   如果需要删除的数据占全部数据的80%以上,而且数据量在百万级以上,那么就得考虑删除效率问题了。
    • 先把可用数据迁移到其它地方,如:

      代码

      If OBJECT_ID('InvTrans_AccountPeriodLine_Temp') is not null
      Drop Table InvTrans_AccountPeriodLine_Temp
      Select * into InvTrans_AccountPeriodLine_Temp From InvTrans_AccountPeriodLine Where AccountPeriod<=@AccountPeriod

    • 然后,删除原表所有数据:

      Truncate table InvTrans_AccountPeriodLine

    • 最后,把刚才迁移的数据迁移回来:

      Insert Into InvTrans_AccountPeriodLineBin Select * From InvTrans_AccountPeriodLineBin_Temp

  • 如果数据量小的话,那么直接用Delete 脚本就可以搞定。

以上,是一点点建议,是否还有更合理的算法。