Oracle中CTAS复制表(含并行无日志、百万行大表)是否锁定原表?
Oracle CTAS语句对原表的锁机制解答
嘿,针对你提出的两个关于Oracle数据库CTAS语句锁表的问题,我结合实际运维经验给你拆解清楚:
1. 带NOLOGGING PARALLEL 4的CTAS是否会锁定原表existing table?
答案是:不会导致原表被完全锁定,具体来说:
- 这类CTAS语句对原表持有的是共享锁(S锁),这种锁的兼容性很好:其他会话可以正常读取原表,也能对原表执行插入、更新、删除等DML操作(行级修改不受影响);
- 只有那些需要获取表级排他锁(X锁)的操作,比如
ALTER TABLE、DROP TABLE、TRUNCATE TABLE这类DDL,才会被CTAS的S锁阻塞,直到CTAS执行完成; - 至于
NOLOGGING和PARALLEL 4参数,它们只作用于新表newtable:NOLOGGING让新表的数据写入不生成重做日志(节省IO资源),PARALLEL 4启用4个并行进程加速数据复制,完全不会改变对原表的锁策略。
2. 复制数百万行的大表时,普通CTAS是否会锁定原表?
和上面的逻辑完全一致:
- 不管原表数据量多大,CTAS执行期间对原表依然只持有S锁,不会升级为排他锁;
- 得益于Oracle的一致性读(Read Consistency)机制,CTAS会基于语句启动时刻的数据快照来读取原表数据,原表后续的DML操作既不会干扰CTAS的复制结果,也不会被CTAS阻塞;
- 唯一需要注意的是,如果你的CTAS语句里包含复杂的聚合、关联操作,执行时间可能会更长,但锁表的类型和范围不会变化,依然是不影响正常业务的S锁。
内容的提问来源于stack exchange,提问作者Kiran
相关产品推荐
相关产品推荐

