这个hint是针对整个sql,让数据库以直接加载的方式(direct load)将数据加载入库。这个提示不会检查当前是否有插入所需要的块空间,相反它会直接将数据添加到新块中。这样会浪费空间,但可以提高插入的性能。需要注意的是,数据将被存储在HWM之上的位置。
为啥性能好呢?
1.插入的时候不走buffer cache(共享池);
2.不会在高水位线(HWM)下面去找是否存在能插入的数据块;
3.在非归档模式或者归档模式下但是nologing,使用append在插入数据时不会产生redo;
但是执行sql过程会产生少量redo;
副作用:
1.占用的磁盘空间比普通的多;
2.append时会在目标表加lmode=6的排它锁(TM enqueue),此时他人人无法对其DML操作;

在不同版本作用不一样:

append在10g只能运用到 insert into..values select语句;
在11gR2,在insert values也可以支持,为append_values;
Insert并发也是直接加载的方式;

要注意的:
1.是用append/append_values时:必须要先提交:
否则查询报错:
ORA-12838: 无法在并行模式下修改之后读/修改对象;
2.append_values不要在单行insert里面使用,否则造成极大的空间浪费呀;
结合绑定变量批量提交比较合适;
3.insert要使用并发插入,前提: alter session enable parallel dml;
否则不会生效;真正的并发插入是直接加载方式;且必须查看真实的执行计划才可以看到;

1先验证一下,append的并发插入

drop table ysy_t;
create table ysy_t
as select a.OBJECT_ID,a.OBJECT_NAME,a.OBJECT_TYPE  from dba_objects a where 1=2;drop table ysy_t2;
create table ysy_t2
as
select * from dba_objects;
--未开启并发
insert /*+ parallel*/ into  ysy_t
select a.OBJECT_ID, a.OBJECT_NAME, a.OBJECT_TYPEfrom ysy_t2  awhere object_id > 20 and object_id <40; 

注意:此时的插入加载方式还是普通插入CONVENTIONAL;
你看到并发实际上是select的;因为parallel作用的是整个语句;
等价:
insert  into  ysy_t
select /*+ parallel*/ a.OBJECT_ID, a.OBJECT_NAME, a.OBJECT_TYPEfrom ysy_t2  awhere object_id > 20 and object_id <40;然后开启并发插入
alter session enable parallel dml;
explain  plan for
insert /*+ parallel*/ into  ysy_t
select a.OBJECT_ID, a.OBJECT_NAME, a.OBJECT_TYPEfrom ysy_t2  a
where object_id > 20 and object_id <40;
select * from table(dbms_xplan.display);


你会发现,预估的执行计划parallel不起作用,此时并没有真正的并发插入;
这个需要查看真实的执行计划才可以看到:
select * from v$sql aa where aa.SQL_TEXT like ‘%insert /+ parallel/ into%’;
select * from table(dbms_xplan.display_cursor(‘7txkrca00mk63’,0,’advanced’));


可以发现出现了 load as select,说明开启dml并发后,果然走了直接加载的方式;
如果你用set autotrace on 查看执行计划呢?

这个应该也是加锁的原因导致的,但是也恰好说明并发插入确实是以直接加载的方式在执行;
第三点的验证这里就完了;

2在看看append方式插入后,查询会不会产生物理读

--验证
直接路径访问是绕过SGA,直接把数据读入到PGA中,这个过程数据不经过SGA
的缓冲,所以理论上应该是更快。在PGA中的数据只能有当前PGA进程能够访
问,当其他会话需要访问这部分数据时需要从磁盘读取数据,发生磁盘读。
drop table ysy_t;
create table ysy_t
as select a.OBJECT_ID,a.OBJECT_NAME,a.OBJECT_TYPE  from dba_objects a where 1=2;     drop table ysy_t2;
create table ysy_t2
as
select * from dba_objects;--普通
insert into  ysy_t
select a.OBJECT_ID, a.OBJECT_NAME, a.OBJECT_TYPEfrom ysy_t2  awhere object_id < 20;
插完:查询会直接走缓存;


查一下数据:select * from ysy_t a where a.object_id=15;此时的物理读为0;

--append方式
insert /*+ append*/ into  ysy_t
select a.OBJECT_ID, a.OBJECT_NAME, a.OBJECT_TYPEfrom ysy_t2  awhere object_id > 20 and object_id <40;


插完:第一次查询会走磁盘读,后面再查就是缓存了;
select * from ysy_t a where a.object_id=26;

这点验证完毕;

再看看append_values方式插入,每一条数据是不是占用一个块;
浪费的不要不要的

insert /*+append_values*/ into ysy_t(OBJECT_ID, OBJECT_NAME, OBJECT_TYPE)
values('90', 'ysy', '05');insert /*+append_values*/ into ysy_t(OBJECT_ID, OBJECT_NAME, OBJECT_TYPE)
values('90', 'ysy', '06');好,插入2条记录;先不提交;
直接查询会报错:select * from  ysy_t;说明了appand_values跟append一样,必须要先提交下才能查;


查看一下,刚插入的2条记录在那个块上面
select rowid, dbms_rowid.rowid_block_number(rowid)
from ysy_t a
where a.object_name = ‘ysy’;

可以看到,2条数据分别占用了2个块;简直浪费
要知道,一个8k块,最多可以存700多行数据的;

于是强烈建议在批量使用场合使用:

drop table  ysy_t;
create table   ysy_t
as
select * from dba_objects where 1=2;drop table  ysy_t_append;
create table   ysy_t_append
as
select * from dba_objects where 1=2;-- append_values
declaretype  t_type is table of ysy_t_append%rowtype;  v_tab t_type;cursor c_get_t is select * from dba_objects;
beginopen c_get_t;fetch c_get_t bulk collect into v_tab;forall x in 1.. v_tab.countinsert /*+ append_values*/ into  ysy_t_append values v_tab(x);commit;close c_get_t;
end;查看 每个文件号里面每个块存放多少行数据
select fno,blockno,count(1) from (
select dbms_rowid.rowid_relative_fno(rowid) fno,dbms_rowid.rowid_block_number(rowid) blockNofrom ysy_t_append)group by fno,blockNoorder  by 3 desc;这个可以自行测试,可以发现,即保证了效率,也不至于太浪费空间;

oracle append作用分析相关推荐

  1. 【深度长文】循序渐进解读Oracle AWR性能分析报告

    [深度长文]循序渐进解读Oracle AWR性能分析报告 原创 2016-10-19 韩锋 DBAplus社群 http://mp.weixin.qq.com/s?__biz=MzI4NTA1MDEw ...

  2. ORACLE 执行计划分析

    http://www.cnblogs.com/rootq/archive/2008/09/06/1285779.html ORACLE 执行计划分析 一.什么是执行计划 An explain plan ...

  3. SAP与ORACLE的区别分析及对比

    SAP与ORACLE的区别分析及对比[转] 目前在ERP业界中存在两个巨愕--SAP 的 ECC 及 ORACLE 的 EBS ,这两个大型ERP解决方案几乎占据了世界上各个不同行业的大型企业的信息系 ...

  4. oracle 10g 速度慢,让Oracle跑得更快—Oracle 10g性能分析与优化思路_数据库教程

    资源名称:让Oracle跑得更快-Oracle 10g性能分析与优化思路 内容简介: 在这本书里读者将会学到作者在性能优化方面的一些思路和思考,一些故障处理的方法和原则,这些东西是作者在实践中长期积累 ...

  5. oracle 语法分析表,Oracle 语句优化分析说明

    Oracle 语句优化分析说明 更新时间:2009年09月17日 21:52:20   作者: Oracle 语句优化技巧,大家可以参考使用,使你的oracle运行效率更高更好. 1. ORACLE ...

  6. python赋值语句格式_Python赋值语句后逗号的作用分析

    Python赋值语句后逗号的作用分析 本文实例讲述了Python赋值语句后逗号的作用.分享给大家供大家参考.具体分析如下: IDLE 2.6.2 >>> a = 1 >> ...

  7. 电话光端机原理及作用分析

    常用的光端机分为多种类型,例如电话光端机.网络光端机.音频光端机.视频光端机.串口光端机.PDH光端机等.通常,电话光端机是最常用的,并且它们也被广泛使用.今天,就由光端机专业厂家飞畅科技来为大家普及 ...

  8. ORACLE SGA问题分析

    ORACLE SGA问题分析 select sum(value)/1024/1024 from v$sga;  --查看SGA总大小 select current_size from v$bu ...

  9. Oracle递归查询示例分析

    Oracle递归查询示例分析 start with connect by 层次查询(Hierarchical Queries) 从顶级向下级查询 Select  a.areaid,a.name,a.p ...

  10. torch.stack作用分析

    torch.stack作用分析 语法 torch.stack(tensors, dim=0, *, out=None) --> Tensor 作用 Concatenates a sequence ...

最新文章

  1. NE 题库 38个知识点总结
  2. identifier starts immediately after numeric literal
  3. pycharm配置python路径_pycharm如何配置python环境
  4. 双向滚动scrollview
  5. 图像的存储格式转化(python实现)
  6. deepin编译Linux内核,为Deepin编译Linux 5.10内核的悲伤故事经历:从入门到卸载
  7. Java反射基础(一)--Class对象获取
  8. python函数定义语句可执行_python学习笔记-定义函数
  9. 免费生成十字绣字体_十字绣鞋垫图案 手工鞋垫历史长
  10. 巩固知识体系!淘宝秒杀脚本java
  11. swift3.0 coreData的基本使用,简单实现增删改查
  12. 20191130每日一句
  13. Java商城 架构演化
  14. python日常练习五,PPT批量转化pdf,批量把Word存入excel
  15. Linux 目录操作—opendir、readdir、closedir
  16. 高通CSR8675蓝牙音频芯片怎么样?CSR8675处理器参数介绍
  17. pc安装android,在电脑上安装安卓的过程
  18. 元旦给计算机老师发贺词,给老师的元旦祝福语
  19. mipi的dsi全称_MIPI-DSI/CSI协议介绍
  20. 让IPFS星际文件系统永久保存你的数据

热门文章

  1. PIE-engine 教程 ——提取黄河流域/山西省1980—2018年流域降水量并对比分析
  2. win10 开机黑屏时间长 联想y470解决方案
  3. FMI飞马网IT书籍赠送:参加获奖就送智能技术/软件开发/Web技术/数据科学计算机科学/网络技术/IT文化与互联网
  4. USB、MiniUSB、MicroUSB
  5. 芯片自主注释流程代码
  6. POJ 1035 拼写检查
  7. 电视盒子刷linux树莓派,变废为宝二:闲置“树莓派”开发板秒变电视盒子!
  8. Connection closed prematurely
  9. 是否开启谷歌Ad广告中的搜索网络合作伙伴?
  10. 看完这篇你还不明白如何解决分布式Session?