Oracle大表插入优化:使用/*+ append parallel */提示能否提升插入速度
关于Oracle大表直接插入方案的性能分析
你给出的SQL写法(语法上in应为笔误,实际为into):
Insert /*+ append parallel */ into (select * from hugetable where 1 = 2) select * from table2
本质等价于直接向hugetable执行带append和parallel提示的插入操作,嵌套子查询的写法没有额外性能增益。
该方案的性能优势
append提示会触发直接路径插入:数据直接写入表的高水位线以上区域,不会扫描现有数据块寻找可用空间,同时大幅减少undo生成量,若表设置为nologging模式,redo生成量也会降到极低,性能远高于普通插入。parallel提示会开启并行执行,只要数据库CPU、IO资源充足,大数据量下的插入效率会有数量级提升,你也可以显式指定并行度避免占用过多资源,例如/*+ append parallel(hugetable, 4) */指定并行度为4。
和你原有分区交换方案的对比
两种方案的适用场景不同,性能差异非常明显:
- 如果你要插入的数据刚好对应
hugetable的一个完整新分区,且分区交换不需要额外做索引重建、数据校验等操作:分区交换的性能远高于直接插入,因为分区交换本质是修改Oracle数据字典的元数据,没有大量IO开销,无论数据量多大都是秒级完成。 - 如果你要插入的数据分散在多个分区、不属于完整分区数据,无法使用分区交换方案:你给出的直接插入方案性能会优于「先插工作表再交换」的流程,毕竟少了一次写入工作表的IO开销。
注意事项
- 直接路径插入会在执行期间持有表的排他锁,插入过程中其他会话无法对该表执行DML操作,若该表是7*24小时在线的业务表,需要评估锁表对业务的影响。
- 若
hugetable存在全局索引,直接路径插入后全局索引会失效,需要额外重建,这部分开销要提前纳入评估,本地索引则不会有该问题。 nologging模式下的直接路径插入数据不会记录到redo日志,插入完成后建议做一次全量备份,避免介质恢复时该部分数据丢失。- 插入完成后需要及时提交事务,否则其他会话无法访问新插入的数据。
内容的提问来源于stack exchange,提问作者Diego Alvez Puerto
相关产品推荐
相关产品推荐

