1、传统串行insert方式
常见的insert方式有两种:
(1) insert into table_name values(....)
(2) insert into target_table select* from source_table
上面这两种常规的插入式,默认都是在串行方式下的插入,会将insert的数据写入buffer_cache,插入前检查表中是否有block中存有空闲空间可以追加插入,并写入redo log。
2、直接路径(direct-path)insert优点与使用要点
2.1、Direct-path insert 方式的优点
(1) 可以将insert数据跳过buffer_cahce,省掉了buffer block的格式化与DBWR操作,直接从PGA写入磁盘
(2) 不检查表中现有的block是否有空闲空间,直接在表的高水位线(HWM)以上插入
(3) 如果在数据库处于非归档模式下,或者是数据就处于归档模式,表级处于nologging状态下,只有少量的空间信息redo写入、不写入数据undo(因为要回滚时可以直接回退到高水线即可,而不需要针对insert生成delete的回滚记录),所以在特定的情况下,直接路径(direct-path)的insert方式,在性能上远远快于常规的串行插入方式。
2.2、使用direct-path insert需要特别注意的要点
2.2.1 DB非force loggging模式下direct-path insert对redo与undo的写入影响
如果在数据库处于归档模式,以及表处于logging模式下,直接路径(direct-path)性能提升会大打折扣,因为,虽然direct-path能生效,但是仍然会记录下完整的redo和undo。
也就是说,在归档模式下,还需要将表改成nologging模式,才不会写数据的redo。
2.2.2 DB force logging模式下direct-pathinsert对redo的写入影响
Note: If the database or tablespace is in FORCE LOGGING mode, then direct-path INSERT always logs, regardless of the logging setting. |
如果数据库或表空间在forcelogging模式,则direct-path insert总是会写日志,无论logging如何设置。