dml过程中会产生锁,先了解下锁的模式:
0:none
1:null 空
2:Row-S 行共享(RS):共享表锁
3:Row-X 行专用(RX):用于行的修改
4:Share 共享锁(S):阻止其他DML操作
5:S/Row-X 共享行专用(SRX):阻止其他事务操作
6:exclusive 专用(X):独立访问使用
如果使用非online,会阻塞表上的DML交易,造成长时间的交易超时。
使用online,会等待dml的锁释放之后,在创建,会加上创建时间。
总结:
1. 非online方式创建索引,不能存在正在执行的DML,否则create index就会抛出ORA-00054。如果非online创建索引过程中,有正在执行的DML,则这些操作会hang,直到create index执行完成。换句话说,对于频繁DML的表,因为并发操作,有可能一直无法创建索引,也有可能创建索引的过程中,影响其他DML操作。
2. online方式创建的索引,如果存在正在执行的DML,会一直等待,直到所有DML完成。如果使用online创建索引过程中,有正在执行的DML,则不会影响。
3. 对于非online,创建索引过程中,会阻碍其他的DML,对于online,创建过程中,不会阻碍其他DML。
4. 相对来说,online比非online对现有DML的影响较小,但是二者,都存在无法创建的可能。
5. 针对无法创建的可能,一种方法,就是暂停业务,暂停所有DML操作,这样可以顺利地创建完成,此时选择非online,相比使用online,可以更快创建