今天开发提交了一个sql:
alter table T_STUDENT add student_auth NUMBER(1) default 0;
--该表是 学生表,是系统的主要业务表,数据170万左右。
开始,没仔细想,直接拿到生产上去执行了,然后发现一分多钟还没完,查看系统锁情况,二十张业务表貌似收到阻塞一直被锁。
赶紧cancel 了。
分析这个动作,add 字段应该很快,只是修改数据字典。然而,添加默认值,等同于 update 全表,也就是锁了全表。
将该语句分解为如下:
alter table T_STUDENT add student_auth NUMBER(1) ;
ALTER TABLE T_STUDENT MODIFY (student_auth default 0);
--批量提交
BEGIN
FOR i IN 1 .. 5 LOOP
UPDATE T_STUDENT SET STUDENT_AUTH = 0
WHERE STUDENT_AUTH IS NULL
AND ROWNUM <=100000;
COMMIT;
END LOOP;
END;
/