之前做过Oracle和MySQL DDL的时候有哪些情况要注意的。一直没有做PostgreSQL的,今天这个用实验说明一下。这里用的是15版本。
Oracle是从11G版本支持的,MySQL是从8版本以后支持的。
这些年PostgreSQL发展也迅速,他一年一个大版本的节奏。至于最早是哪个版本?什么时间的实在说不清楚。不过有一点就是数据库都应该尽快跟着官方走。紧跟官方脚步。
[pg15@dev-dbteam-148180 ~]$ psql
psql (15.3)
Type "help" for help.
postgres=# \d
List of relations
Schema | Name | Type | Owner
--------+-------------------+-------+----------
public | walminer_contents | table | postgres
(1 row)
创建一个空的数据库
postgres=# create database p;
CREATE DATABASE
postgres=# \c p
You are now connected to database "p" as user "postgres".
^
创建一个和MySQL实验时候一模一样表结构的表。
p=# create table thousand (id int,a int,name varchar(10),time date);
CREATE TABLE
写了一个存储过程,批量写入1000万数据。

增加一个不带默认值的字段。

从实验得出结论,DDL在不到2毫秒完成。没有问题。
增加一个非空且带有默认值的字段,实验观察该DDL1毫秒完成,没有问题。

在这个千万级别的表上增加一个带默认值,但是没有非空的DDL。

从实验结果看只用1毫秒,DDL没有阻塞,没有问题。
最后一个场景,增加一个字段,并且对字段进行扩容,而且超过之前在MySQL中256的界限。

从实验结果看都不超过2毫秒,DDL没有阻塞,没有问题。
总体说来至少从PostgreSQL15版本的使用来看表结构变更的DDL,是没有问题的。
最后做一点总结,且不管用的是Oracle、MySQL还是PostgreSQL,现在主流数据库的主流版本都已经或者说早已经解决了大表字段增加的问题。
不过我这里提一点其实DDL不仅仅是加字段,还有建立索引。Oracle 建立索引时候有online和并行。但是MySQL在大表加索引的时候,还是会有锁的情况。索引这个问题最好不是事后加。




