在线更新SQLServer数据库千万级记录的大表
小职 2018-07-02 来源 : 阅读 3230 评论 0

摘要:本文主要向大家介绍了在线更新SQLServer数据库千万级记录的大表,通过具体的内容向大家展示,希望能对大家学习SQLServer数据库有所帮助。

本文主要向大家介绍了在线更新SQLServer数据库千万级记录的大表,通过具体的内容向大家展示,希望能对大家学习SQLServer数据库有所帮助。

由于某些原因,导致此表中的3个字段需进行更新,同时要求停机时间尽可能的短,相关sql如下:

--停机更新3个字段需耗时80分钟UPDATE big_table SET P1 = 'N', P2 = 'N', P3 = 'N'

问题分析

由于停机执行上述update语句需耗时80分钟,因此考虑使用在线更新方案。分析表的字段内容与含义,发现表存在自增列id。

我们重新理解聚集索引表与堆表,评估update语句对单表的影响:在SQL Server中,执行update语句可能产生阻塞。这里我们使用高频率的update小批量高频度的进行更新可以有效降低阻塞的时间。

解决办法

创建一个视图,并通过job的方式高频度的更新视图上的这3个字段,同时检查更新的执行计划是否通过索引。

详细代码如下: 
- 创建一个视图与一个临时表

--创建一个含主键与3个字段内容的视图create view vv asSELECT Id, P1, P2, P3 FROM big_tableGO

--创建一个记录更新的临时表create table tmp_values (

    ctime datetime primary key default getdate(),

    n bigint not null

)

--插入初始insert  tmp_values (n) values(0)


· 为了降低SQL Server的阻塞,我们将更新sql代码修改成一个存储过程,然后通过Job去定期执行

--创建更新的存储过程CREATE  PROCEDURE updatevvasbegin 

    DECLARE @i bigint
    DECLARE @num bigint
 
    --每次更新1500条记录
    set @num=1500
    set @i=(select top 1 n from tmp_values order by ctime desc)
 
    insert  tmp_values (n) values(@num+@i)
    update vv set P1='N', P2='N', P3='N'
        where id<@i+@num and id>=@iend


注意:这里并没有使用@@rowcount,是由于这个表的内容决定的。

本文由职坐标整理并发布,了解更多内容,请关注职坐标SQL Server数据库频道!

本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程