oracle 千万级数据表更新,在线更新SQLServer数据库千万级记录的大表

本文提供了一种在线更新SQLServer数据库中千万级记录大表的方法,通过创建视图和使用存储过程,以小批量高频度的方式更新表中3个字段,减少停机时间。此方案旨在解决传统UPDATE语句导致的长时间阻塞问题,确保系统稳定运行。
摘要由CSDN通过智能技术生成

本文主要向大家介绍了在线更新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 updatevvasbeginDECLARE @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=@iend

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值