修改表字段长度的操作,对业务是否有影响?

简介: 前两天测试同学问了一个问题,表中某一个字段,需要改一下长度,对业务是否会有影响?可能隐约之中,我们觉得没影响,但又好像有影响,究竟有何影响,我们从实验来看最科学。

前两天测试同学问了一个问题,表中某一个字段,需要改一下长度,对业务是否会有影响?


可能隐约之中,我们觉得没影响,但又好像有影响,究竟有何影响,我们从实验来看最科学。


首先建测试表,NAME字段是VARCHAR2(10),10个字节的字符串类型,表有256万数据。我们将其长度改为20,从执行时间看,只有20毫秒,



我们对上面的操作,做一下10046 trace,发现确实,首先使用LOCK以EXCLUSIVE模式锁定了TBL表,


接下来执行alter table修改操作,



从trace文件看,主要是针对一些数据字典表的操作,其中包含28次select,10次update,12次delete,可以想象一个改字段长度的操作,就有几十次SQL操作,但用时仅为毫秒级,效率可见一斑。


我们从alter table新增字段操作究竟有何影响?(下篇)的介绍,可以知道,EXCLUESIVE模式的锁,是最高级别的锁,Alter table,Drop table,Drop index,Truncate table这些常见的DDL操作,都会需要这种级别的锁,我们知道Oracle中select这种查询(不带for update)是不会有锁的,因此若表有EXCLUSIVE级别的锁时,仅允许select操作(不带for update),禁止其他类型的操作,

从锁的强弱看,EXCLUSIVE(exclusive,X)>SHARE ROW EXCLUSIVE(S/Row-X,SRX)>SHARE(Share,S)>ROW EXCLUSIVE(Row-X,RX)>ROW SHARE(Row-S,RS)。


最后,引述一篇博客的总结(http://blog.itpub.net/9252210/viewspace-626388/),

2级锁Row-S行共享(RS):共享表锁,sub share,锁有:Select for update,Lock For Update,Lock Row Share。

3级锁Row-X行独占(RX):用于行的修改,sub exclusive,锁有:Insert, Update, Delete, Lock Row Exclusive。

4级锁Share共享锁(S):阻止其他DML操作,share,锁有:Create Index, Lock Share,locked_mode为2,3,4不影响DML(insert,delete,update,select)操作, 但DDL(alter,drop等)操作会hang。

5级锁S/Row-X共享行独占(SRX):阻止其他事务操作,share/sub exclusive,锁有:Lock Share Row Exclusive,具体来讲有主外键约束时update / delete … ; 可能会产生4,5的锁。

6级锁exclusive 独占(X):独立访问使用,exclusive,锁有:Alter table, Drop table, Drop Index, Truncate table, Lock Exclusive。


因此,针对上面VARCHAR2(10)改为VARCHAR2(20)的操作,我们的结论是修改字段长度的操作是会阻碍其他非select操作,但是持续的时间很有限,几乎可以说是忽略不计,因为需要操作的是数据字典信息,并不是表自身,所以和要操作表的记录总量,没有任何关系。


无意之中,发现了另一个问题,将字段长度从VARCHAR2(20)改为VARCHAR2(10),用时比之前要久,540毫秒,几乎是之前的10倍,


我们看下他的trace,首先还是以EXCLUSIVE模式锁表,


接着执行alter table操作,


我们从下面的信息,看出了一些端倪,


以FIRST_ROWS优化器模式执行select操作,条件是字段NAME长度>10,因为现在是要将字段长度,从20改为10,就需要判断是否已存数据中,有违反长度的记录,如果有则禁止此操作,所以需要以全表扫描,来检索表中所有记录,rows是0,则继续执行其他操作,需要注意的是,他采用了FIRST_ROWS模式,会以最快的速度返回记录,因此执行时间还是可控的,从操作上来看,整个操作包含27次select,10次update,12次delete,其中判断LENGTH("NAME")>10的语句占用了几乎90%的SQL执行时间。


总结:

1. 若是增加长度的操作,会以EXCLUSIVE模式锁表,但其主要操作的是数据字典表,锁占用时间几乎可以忽略不计,所以几乎不会影响业务。

2. 若是缩短长度的操作,还会以EXCLUSIVE模式锁表,但需要以FIRST_ROWS优化器模式,执行全表扫描,判断已存数据是否有超长的记录,因此相比(1)执行时间会略久,但基本可控。



如果您觉得此篇文章对您有帮助,欢迎关注微信公众号:bisal的个人杂货铺,您的支持是对我最大的鼓励!共同学习,共同进步:)

目录
相关文章
|
设计模式 缓存 编译器
【C++ 元对象系统03】深入探索Qt反射:从原理到实践
【C++ 元对象系统03】深入探索Qt反射:从原理到实践
918 5
|
存储 JavaScript API
vue3+ant design vue 自定义文件上传和自定义上传进度条
1.关键点是Upload组件中customRequest的API,它能通过覆盖默认的上传行为,可以自定义自己的上传实现(具体可看官方文档); 2.通过在Upload组件中绑定progress实现。 下面是详细代码
3626 0
|
传感器 编解码 运维
示例SysML设计“罗卜”快跑自动驾驶
【10月更文挑战第6天】本文介绍了“罗卜”自动驾驶汽车系统的完整设计,使用SysML的Internal Block Diagram (IBD) 描述了系统的主要子系统及其内部结构和交互。通过定义块、部分属性、端口、接口和连接器,IBD图详细展示了感知系统、控制系统、导航系统和动力系统之间的数据传输和交互。文章分析了IBD图的优点,包括清晰定义系统结构、统一接口和交互、提高系统设计的可理解性和可维护性,并讨论了其在系统集成和测试中的应用。同时,也指出了IBD图的局限性,如复杂性管理困难、动态行为表示不足和学习曲线陡峭等问题。
638 4
|
Java 测试技术 数据库连接
SpringBoot单元测试 Mybatis:增删改查
SpringBoot单元测试 Mybatis:增删改查
1491 0
|
缓存 NoSQL Redis
Redis 如何批量设置过期时间?PIPLINE的使用
不要说在foreach中通过set()函数批量设置过期时间 我们引入redis的PIPLINE,来解决批量设置过期时间的问题。
981 0
Redis 如何批量设置过期时间?PIPLINE的使用
|
存储 Shell 开发工具
基于树莓派的流星雨监测系统(RMS)的搭建
该文介绍了基于树莓派的流星雨监测系统的改造系列,包括改造的第二和第三部分。作者分享了选用索尼IMX291 USB摄像头和大光圈镜头的设备选型,并提供了树莓派的固定及防反光处理方法。文章简化了RMS安装过程,强调了针对USB摄像头用户的安装步骤,通过创建venv、安装依赖库和脚本实现开机自动运行。此外,还调整了系统参数以适应城市光污染环境,并修改了监测时间以避免室内灯光干扰。
|
关系型数据库 MySQL
mysql最大连接数怎么设置
mysql最大连接数怎么设置
2056 0
mysql最大连接数怎么设置
|
存储 监控 数据可视化
Nginx+Promtail+Loki+Grafana Nginx日志展示
通过这些步骤,你可以将Nginx的日志收集、存储、查询和可视化整合在一起。这样,你就可以在Grafana中轻松地创建和展示Nginx日志的图表和面板。
760 3
|
存储 SQL 关系型数据库
MySQL|什么情况下拓展字段长度会锁表?
作为产品DBA,经常被开发问,修改字段长度锁表吗?然后凭借"经验"给出回答:如果字段长度超过256个字符就会锁表。现在看来回答错误 。看看MySQL 官方文档Extending VARCHAR column sizeThe number of length bytes(字节) required by...
1227 0
MySQL|什么情况下拓展字段长度会锁表?