Oracle 直接路径插入(Direct-Path Insert)

本文详细介绍了Oracle的DirectPathInsert技术,一种通过牺牲空间和安全性来提升数据加载速度的策略,包括其与传统插入的区别、应用场景以及与重做日志的关系。同时提供了使用示例和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接路径插入(Direct Path Insert)是Oracle一种数据加载提速技术,可以在使用insert语句或SQL*Loader工具大批量加载数据时使用。直接路径插入处理策略与普通insert语句完全不同,Oracle会通过牺牲空间,安全性,并发性能来换取加载速度。

一、Direct-path Insert简介

普通insert语句叫做"传统插入"(Conventional Insert),数据在插入过程中会先缓存在buffer cache中,写入磁盘时会检查并重用数据块中的可重用空间,记录redo日志,维护完整性约束等,这些维护操作都是性能开销,而"直接路径插入"会忽略这些维护操作,换取插入性能的提升。

在海量数据加载场景,特别是向新表大批量加载数据时(加载数据存在原始备份、新表没有可重用空间、并发访问很低)。我们的第一需求可能是加载速度。针对此类场景Oracle提供了一种性能更高的数据加载方式:“直接路径插入”(Direct-Path Insert)。

传统插入与直接路径插入主要有以下5点区别:

  • 传统插入会经过buffer cache缓存后再写数据文件,而直接路径插入会直接写数据文件,这也是Direct-Path Insert名称的由来。
  • 传统插入会重用数据块中的空闲空间,即新旧数据混在一起。而Direct-Path Insert会直接在高水位线(High-Water Mark, HWM)之上追加写数据,即只在新的数据块中写数据,旧数据块中即使有空间也不会重用(更多的空间消耗)
  • 传统插入会维护引用完整性约束,Direct-Path Insert不会维护完整性约束(必须删除或禁用引用完整性约束)
  • 传统插入必须生成redo日志,Direct-Path Insert可以选择关闭redo日志(无法进行Media Recovery)
  • 传统插入不会影响表上其他DML操作,而Direct-Path Insert会获取表级的X锁,因此表上的insert, delete, update都会被阻塞(无法并发)

二、Direct-Path Insert应用场景

Direct-Path Insert可以在下列场景中使用:

  • 使用insert into … values … 语句时通过hint指示Oracle使用Direct-Path Insert
  • 使用insert into … as select … 语句时通过hint指示Oracle使用Direct-Path Insert
  • 使用并行执行,Oracle会自动使用Direct-Path Insert
  • 使用SQL*Loader工具向加载数据时指定使用Direct-Path Insert

2.1 insert into … values … 语句使用Direct-Path Insert

少量的insert into … values …语句通常没必要使用直接路径插入。而在PL/SQL程序中,如果需要通过insert into … values … 语句插入大量数据,则可以选择直接路径插入来提升执行速度。通过在insert关键字后附加/*+ append_values */提示来指示Oracle使用直接路径插入。

示例:建立2张同样的表,分别用传统插入和直接路径插入向表中加载1000万的数据,并记录执行时间:

create table t1(id integer, name varchar2(32));
create table t2(id integer, name varchar2(32));
declare
  type idtype is table of t1.id%
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值