暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

一个很老但是很有用的功能(Oracle MySQL PG 对比)之一

前几天,有人问我要执行一个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万的表。可以看出无论带不带默认值都很快。我演示从简了。

从什么版本开始有这个功能,我不知道。反正我用的比较新的版本。数据库嘛,用最新中的最稳定的才是好的。主流数据库在处理大数据上都已经有很好的表现了。数据不怕多,只要磁盘足够大,设计够好。那都不是事。

点击此处阅读原文
文章转载自开源软件联盟PostgreSQL分会,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论