我的原创连接: 一个很老但是很有用的功能(Oracle MySQL PG 对比)之一 (qq.com)
前几天,有人问我要执行一个DDL的变更。问会锁表多久?我说让我看看SQL。
alter table 表 add 需要加的字段 VARCHAR2(32) default 'N/A';
update 表 set 需要加的字段 = 'N/A';
alter table 表 modify 需要加的字段 not null;
这个数据库是Oracle,看到这个我笑了。其实这个需求是开发要加一个字段,这个字段有个默认值。然后开发觉得加字段之前的值没有,怎么办?停机全表update一次。最后为了防止后续有人写入记录没有默认值。那么就加一个非空约束。整个过程很严谨。但是如果这个表有几千万,几个亿呢?全表update不会很快的,而且这是一个表级锁定。
我给的建议是 alter table 表 add 需要加的字段 VARCHAR2(32) default 'N/A' not null; 用这一句替代了上面的3句。毫秒级别就可以完成。因为这样其实没有执行全表更新只是在数据字典上加上了个默认值。Oracle 认为,只要定了了默认值,而且还是非空的。那么先不加,等调用的时候才真正的赋值。这是非常聪明的做法。就像量子力学中的薛定谔的猫。这个在Oracle11G中实现。应该是最早开创这样使用的。不过如果不带not或者不带default。不行。
MySQL呢,如果大表加字段怎么做?答案就是升级到8.0.在MySQL8以后也可以享受到这个功能。
那么PostgreSQL呢?也来一个1000万的表。可以看出无论带不带默认值都很快。我演示从简了。
从什么版本开始有这个功能,我不知道。反正我用的比较新的版本。数据库嘛,用最新中的最稳定的才是好的。
主流数据库在处理大数据上都已经有很好的表现了。数据不怕多,只要磁盘足够大,设计够好。那都不是事。
