Oracle 11.2.0.3和MySQL5.6 DDL比较(2)

如果没有事物正在访问,进行删除索引2种数据库都是非常快的原因基本一致就是他只是简单的删除
 数据字典信息,然后标记空间为可用,并非真正的删除数据。
mysql> drop index test_ind on testno;
 Query OK, 0 rows affected (0.05 sec)
 Records: 0  Duplicates: 0  Warnings: 0

SQL> drop index test_in;
 Index dropped
 0.17秒

4、ADD COLUMN

在当前有事物的情况下,
 首先
 insert into testti select * from testti where rownum<=1;
另外开启会话
 alter table testti add test varchar2(20);

ORACLE 11G等待事物事物结束,等待事件为:
 enq: TX - row lock contention
  注意11G中有参数ddl_lock_timeout,但是此操作并不是受此参数影响
 但这个操作在10G是报
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

但是如果
alter table testti add test varchar2(20) default 'test1'
 10G 11G都是报错
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

MYSQL同样的机制
 在有事物的情况ADD COL也不能完成 INNODB STATUS 如下:
Trx id counter 462664
 Purge done for trx's n:o < 462661 undo n:o < 0 state: running but idle
 History list length 474
 LIST OF TRANSACTIONS FOR EACH SESSION:
 ---TRANSACTION 0, not started
 MySQL thread id 13, OS thread handle 0x40b4c940, query id 446 localhost root System lock
 show engine innodb status
 ---TRANSACTION 462658, not started
 MySQL thread id 2, OS thread handle 0x40671940, query id 445 localhost root Waiting for table metadata lock
 alter table testno add m int(10)
 ---TRANSACTION 462663, ACTIVE 45 sec
 1 lock struct(s), heap size 360, 0 row lock(s), undo log entries 1
 MySQL thread id 1, OS thread handle 0x40430940, query id 443 localhost root cleaning up

在没有事物的情况下:

ORACLE如果不指定默认值,增加字段非常快,机会瞬间完成,所以不存在堵塞的情况。
 如果是
alter table testti add test varchar2(20) default 'test1';
然后另外开启一个会话
insert into testti select * from testti where rownum<=1;

ORACLE等待时间为:
library cache lock

MYSQL在这方面貌似做得更好,ADD COLUMN不会堵塞任何DDL,他会把期间的操作放入
innodb_online_alter_log_max_size ,等待完成后同步回来,实际上ORACLE和MYSQL
在CREATE INDEX ONLINE的情况下都是使用了这个机制,都是将修改放入一个临时的
 区域完成后进行同步来完成一致性,ORACLE是将临时记录记录到SYS_JOURNAL_****表里面 
只是ORACLE在ADD COL的情况下应该是没有使用的,因为如果没有默认值ORACLE的
 增加COL是非常快的,但是MYSQL有无默认值是一样的。
 会话1:
mysql> alter table testno add m int(10) default 0;
 Query OK, 0 rows affected (43.97 sec)
 Records: 0  Duplicates: 0  Warnings: 0

会话2:
mysql> insert into testno values(122,'test1');
 Query OK, 1 row affected (0.00 sec)
插入不受影响。

5、drop col

drop col ORACLE和MYSQL都和ADD COL带默认值的方式没有太多的区别,ORACLE在没有事物的情况
 下任然会堵塞会话等待为
enq: TM - contention
 MYSQL则不会,但是MYSQL可能的需要重组表类似ORACLE的MOVE TABLE,还需考证

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/88bfc8be592df7d0a22aedf4445df036.html