Oracle append直接路径加载

举报
宁谷花雨 发表于 2022/07/08 16:35:08 2022/07/08
【摘要】 ㈠ 直接路径加载和buffer cache直接路径插入的数据不经过buffer cache,从PGA直接把数据格式化成Oracle块然后由普通的Oracle Server Process进程把数据块写入数据文件因为不经过buffer cache,所以不需要DBWn介入直接路径加载是在高水位之上完成的插入动作,因此无论高水位下有多少空闲块都会被忽略,段空间将会随之增大普通插入,要先将数据块传进...


㈠ 直接路径加载和buffer cache

直接路径插入的数据不经过buffer cache,从PGA直接把数据格式化成Oracle块
然后由普通的Oracle Server Process进程把数据块写入数据文件
因为不经过buffer cache,所以不需要DBWn介入

直接路径加载是在高水位之上完成的插入动作,因此无论高水位下有多少空闲块都会被忽略,段空间将会随之增大

普通插入,要先将数据块传进buffer cache
这是Oracle通常修改数据的方式,不对数据文件直接进行修改,而是在内存中完成修改,再由日志提供保护

㈡ 直接路径加载和undo

差别比较明显的是undo(直接路径几乎没有undo),俩者redo差不多(普通插入稍微多点redo,因为Oracle需要redo来保护undo)
直接路径用HWM回滚,普通插入用undo回滚

在执行直接路径加载的过程中,高水位并没有真正提高,只有在事务提交后才会完成这个动作,在所有维护工作完成之后表才可以被访问
所以,在提交之前如果想查询这张表是不被允许的,同理可知对表的增删改以及merge操作也是不被允许的

㈢ 直接路径加载与index

直接路径插入时,不产生表块的回滚信息,而是依赖高水位点实现回滚
但是,如果表有索引,将会产生索引的回滚信息,而且索引的块会被读进buffer cache

Oracle官方文档建议,如果使用直接路径插入,向表中传送大量数据,可先将表上的索引删掉,插入结束后,再重新建立索引

㈣ 直接路径加载和一些限制

使用直接路径加载方法时需要注意的地方如下:
1)直接路径加载方法不是所有插入方式都支持的,最常见的带有value子句的insert语句就不支持
2)该技术最常用在insert into ... select ...结构的插入语句中
3)在使用直接路径加载技术插入数据直到事务提交,其他的增、删、改、查和merge操作是被禁止的
4)因为是直接路径加载,所以高水位以下的空闲数据库块将不被使用,可能会因此导致数据段无限扩张
5)当被操作的表上存在insert触发器、外键、IOT、表使用到了聚簇技术以及表中包含LOB字段时
直接路径加载技术是无效的,此时将会自动的转变为常规插入


㈤ 小结

使用直接路径加载技术之所以能提高性能是因为,该方法可以保证在加载数据的过程中最大限度的减少回滚数据的生成
expdp/impdp不支持直接路径,而sqlldr支持(由参数direct=true指定,并且同时指定parallel=true,速度将会更快)
如果我们在权衡利弊成本之后能最大化该方法,提高加载速度是必然的!

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。