在线更新SQL Server千万级记录的大表
来源:互联网 发布:万德数据库 编辑:程序博客网 时间:2024/06/05 18:13
目录
- 目录
- 问题描述
- 问题分析
- 解决办法
- 参考资料
问题描述
某表含有2000万+记录行,80+字段,10+索引,单表含索引数据达27GB
由于某些原因,导致此表中的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,是由于这个表的内容决定的。
参考资料
1. SQL Server 2008 Locking
http://blogs.technet.com/b/josebda/archive/2009/03/19/sql-server-2008-locking.aspx
1 0
- 在线更新SQL Server千万级记录的大表
- sql千万级记录的相关测试
- 千万级SQL Server数据库表分区的实现
- 千万级SQL Server数据库表分区的实现
- 千万级SQL Server数据库表分区的实现
- SQL Server用in更新记录时可引用更新表的数据
- 千万级大数据的Mysql数据库SQL语句优化
- MySQL 在线惊心动魄的drop 千万记录表字段
- Sql Server千万级分页存储过程
- SQL Server的在线备份
- MySQL 对于千万级的大表的优化?
- 关联表的批量更新(SQL SERVER)
- sql server多表的更新
- sql千万级表查询
- 千万级的大表!MySQL这样优化更好
- MySQL 对于千万级的大表优化流程
- 2千万记录的Mysql表操作
- [转]sql server 到底能否处理百万级,千万级的数据?
- org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
- 理解Window和WindowManager
- Java基础笔记1-计算机基础
- c++中string常用函数整理<引用>
- 各种排序方法
- 在线更新SQL Server千万级记录的大表
- gbk与utf-8在网页中的一点不同之处
- windows下JDK安装和配置
- Wunder Fund Round 2016 (Div. 1 + Div. 2 combined) C. Constellation
- [自写]react 编辑工具
- rebmuNdilaV.65
- Bzoj 1001
- socket编程的select模型
- 【Codevs】1010 过河卒