MySQL的DDL未必都是可以快速完成的,那么Oracle同等场景下如何?
这个是在Oracle19C下的实验,特别说明。因为在Oracle11G下有些结论是不成立的。
表thousand有大约4000万行记录
SQL> set timing on;
SQL> desc thousand; Name Type Nullable Default Comments ---- ------------ -------- ------- -------- ID INTEGER Y A INTEGER Y NAME VARCHAR2(10) Y TIME DATE Y sysdate
SQL> select count(*) from thousand; COUNT(*) ---------- 40000000 Executed in 0.69 seconds
可以看出和之前MySQL实验的的表结构几乎一模一样。数据量是MySQL的4倍。
下面对这个进行增加字段的DDL。
SQL> alter table thousand add address varchar2(100); Table altered Executed in 0.098 seconds
98毫秒完成。这个命令在11G是不可能这么快的。
再对这个表进行增加字段的DDL,带有默认值和非空约束。 SQL> alter table thousand add status varchar2(20) default '0' not null; Table altered Executed in 0.092 seconds 92毫秒完成。这个命令在11G是也是同样效果。再对这个表进行增加字段带有默认值。 SQL> alter table thousand add QQ varchar2(10) default '0'; Table altered Executed in 0.022 seconds
22毫秒完成。这个命令在11G是不可能这么快的。
接下来要进行扩字段,直接从10长度扩大到70. SQL> alter table thousand modify name varchar2(70); Table altered Executed in 0.061 seconds
61毫秒完成。这个命令在11G是不可能这么快的。而且也没有MySQL的超够64就会重新构建的问题。 SQL> desc thousand; Name Type Nullable Default Comments ------- ------------- -------- ------- -------- ID INTEGER Y A INTEGER Y NAME VARCHAR2(70) Y TIME DATE Y sysdate ADDRESS VARCHAR2(100) Y STATUS VARCHAR2(20) '0' QQ VARCHAR2(10) Y '0'
那么从70再次扩展到更大的长度会如何? SQL> alter table thousand modify name varchar2(200); Table altered Executed in 0.021 seconds 21毫秒完成。
SQL> desc thousand; Name Type Nullable Default Comments ------- ------------- -------- ------- -------- ID INTEGER Y A INTEGER Y NAME VARCHAR2(200) Y TIME DATE Y sysdate ADDRESS VARCHAR2(100) Y STATUS VARCHAR2(20) '0' QQ VARCHAR2(10) Y '0'
尝试一下缩字段长度的DDL。这个在MySQL中会较为漫长。 SQL> alter table thousand modify address varchar2(50); Table altered Executed in 1.614 seconds 1.6秒完成。虽然没有毫秒那么快,但是的确也不慢。
再次扩大长度和缩小长度。
SQL> alter table thousand modify address varchar2(500); Table altered Executed in 0.015 seconds SQL> alter table thousand modify address varchar2(120); Table altered Executed in 1.544 seconds 比较稳定的都是不到20毫秒的扩容和1.5秒左右的缩容。
这些都是19C版本带来的。
之所以要讲这个主要是有时候开发人员问这个操作会执行多久?(担心锁表时间),我第一句话就问?什么版本?如果19C,那么基本不用担心。 SQL>
