ITPub博客

首页 > 数据库 > Oracle > 一个很老但是很有用的功能(Oracle MySQL PG 对比)之一

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

原创 Oracle 作者:xuexiaogang 时间:2022-05-02 21:04:38 1 删除 编辑

我的原创连接:

一个很老但是很有用的功能(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万的表。可以看出无论带不带默认值都很快。我演示从简了。

    从什么版本开始有这个功能,我不知道。反正我用的比较新的版本。数据库嘛,用最新中的最稳定的才是好的。


    主流数据库在处理大数据上都已经有很好的表现了。数据不怕多,只要磁盘足够大,设计够好。那都不是事。



来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/637517/viewspace-2890239/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 讲讲AWR
下一篇: 主键可以重复?
请登录后发表评论 登录
全部评论
OracleACE/PostgreSQLACE/阿里云MVP/腾讯云TVP/墨天轮 MVP/TiDBMVA/数盟会华东区长老/OpenTenBase社区委和技术委委员/架构师技术同盟名人堂成员上海地区理事会成员/if社区联合发起人/《DBA实战手记》作者/公众号:四海内皆兄弟

注册时间:2013-07-01

  • 博文量
    422
  • 访问量
    953392