修改表字段长度的操作,对业务是否有影响?
前兩天測試同學問了一個問題,表中某一個字段,需要改一下長度,對業務是否會有影響?
?
可能隱約之中,我們覺得沒影響,但又好像有影響,究竟有何影響,我們從實驗來看最科學。
?
首先建測試表,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)執行時間會略久,但基本可控。
?
?
?
總結
以上是生活随笔為你收集整理的修改表字段长度的操作,对业务是否有影响?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用svn merge 实现回退版本
- 下一篇: 使用指针星号转移c语言,C中的指针:何时