1 描述

所谓直接路径操作,就是绕过buffer cache,直接将数据插入到表所在的数据文件中;

假如有表A,要将A中的数据插入到表B,在普通的间接插入下,先将A中的数据块传进buffer cache,再将B中的块也传入到buffer cache,在buffer cache的A块中读出行,插入B的块中。B块就变成了脏块,再等DBwn将他们写入数据文件,

2 总结

① 直接路径操作在高水位线以外分配空间,绕过了数据缓冲区,直接将数据插入表所在的数据文件中;

② 直接路径操作不产生redo和undo log,依赖高水点实现回滚。

③ 直接路径插入的时候Oracle会维护索引,为了避免索引的性能影响,可以先删除索引,等插入完成后重新建立。

④ 直接路径插入回答导致对被插入的表加表级锁,在提交之前,别会话不能再对此表进行insert、delete、update等操作。

3 直接路径操作与间接路径操作的不同

直接路径操作在高水位线以外分配空间,绕过了数据缓冲区,直接将数据插入表所在的数据文件中;

① 准备示例数据表

create table student(

stu_id varchar2(4),

stu_name varchar2(100), --姓名

sex varchar2(1),  --性别 1 男  2 女  0 未知

credit integer default 0

);

create table student_temp as select * from student where 1=2;

② 往student表插入数据并提交

insert into student (stu_id, stu_name, sex, credit) values ('0001', '大王', '2', '83');

insert into student (stu_id, stu_name, sex, credit) values ('0002', '刘一', '1', '85');

commit;

查看student表中数据占用的数据块,现在student表中有两行数据,占用数据库70460。

select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid) from student;

查看Buffer cache中student表所占用的缓存。当前包含数据的块70460。

select file#,block# from v$bh where objd=(select data_object_id from user_objects where object_name='STUDENT');

由于对AA表进行了全表扫描,因此,AA表中高水点下的所有块都被读进了Buffer cache。

③ 使用直接路径插入,并提交

insert /*+ append*/ into student_temp select * from student;

commit;

查看student_temp表中数据占用的数据块,现在student_temp 表中有两行数据,占用数据库70476。

select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid) from student_temp;

Buffer cache中student_temp表所占用的缓存,不包含数据块70746。

select file#,block# from v$bh where objd=(select data_object_id from user_objects where object_name='STUDENT_TEMP');

几秒钟后在查看缓存中数据,才包含70746(这个是为什么?)

select file#,block# from v$bh where objd=(select data_object_id from user_objects where object_name='STUDENT_TEMP');

④ 正常插入

insert  into student_temp select * from student;

commit;

查看student_temp表中数据占用的数据块,现在student_temp 表中有四行数据,新数据占用数据库70478。

select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid) from student_temp;

Buffer cache中student_temp表所占用的缓存,不包含数据块70748。

select file#,block# from v$bh where objd=(select data_object_id from user_objects where object_name='STUDENT_TEMP');

1.4 直接路径插入与回滚

直接路径操作不产生redo和undo log,依赖高水点实现回滚。

1.5 直接路径操作索引

1.6 直接路径操作的锁

直接路径插入回答导致对被插入的表加表级锁,在提交之前,任何会话(包括当前会话)不能再对此表进行insert、delete、update等操作。其他会话可以进行select操作。

① 在同一个会话执行insert,不提交,然后执行select操作

insert /*+ append*/ into student (stu_id, stu_name, sex, credit) values ('0003', '陈二', '2', '86');

select * from student_temp;

同一个会话中,未提交之前,其他DML操作也会报此错误

② 换一个会话可以正常执行select操作。Insert等其他DML操作会进入等待状态

直接操作路径:https://blog.csdn.net/rudygao/article/details/40296679

Oracle Hint 之 Append的更多相关文章

  1. SQL优化过程中常见Oracle HINT

    在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见Oracle HINT的用法: 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量, ...

  2. Oracle hint手动优化

    例子 select/*+FULL(fortest)*/ * from fortest where id = 2000000 //使用0.70s时间 select* from fortest where ...

  3. 品味性能之道<十>:Oracle Hint

    Hint 是Oracle 提供的一种SQL语法,它允许用户在SQL语句中插入相关的语法,从而影响SQL的执行方式. 因为Hint的特殊作用,所以对于开发人员不应该在代码中使用它,Hint 更像是Ora ...

  4. SWAP_JOIN_INPUTS Oracle Hint(处理hash join强制大表(segment_size大)作为被驱动表)

    SWAP_JOIN_INPUTS Oracle Hint(处理hash join强制大表(segment_size大)作为被驱动表) swap_join_inputs是针对哈希连接的hint,它的含义 ...

  5. Oracle Hint 用法

    正确的语法是: select /*+ index(x idx_t) */ * from t x where x.object_id=123 /*+    */ 和注释很像,比注释多了一个“+”,这就是 ...

  6. Oracle Hint 详解

    Hint 是Oracle 提供的一种SQL语法,它允许用户在SQL语句中插入相关的语法,从而影响SQL的执行方式. 因为Hint的特殊作用,所以对于开发人员不应该在代码中使用它,Hint 更像是Ora ...

  7. oracle --hint总结

    得到一条sql语句执行计划的常用方法:1.explain plan 命令  2.DBMS_XPLAN包3.sqlplus中的AUTOTRACE开关4.10046事件5.10053事件6.AWR报告或者 ...

  8. 【DBAplus】SQL优化:一篇文章说清楚Oracle Hint的正确使用姿势

    原创 2016-09-12 韩锋  作者介绍 韩锋,宜信技术研发中心数据库架构师.精通多种关系型数据库,曾任职于当当网.TOM在线等公司,曾任多家公司首席DBA.数据库架构师等职,多年一线数据库架构. ...

  9. SQL优化:一篇文章说清楚Oracle Hint的正确使用姿势

    一.提示(Hint)概述 1为什么引入Hint? Hint是Oracle数据库中很有特色的一个功能,是很多DBA优化中经常采用的一个手段.那为什么Oracle会考虑引入优化器呢?基于代价的优化器是很聪 ...

随机推荐

  1. [USACO07MAR]黄金阵容均衡Gold Balanced L… map

    题目描述 Farmer John's N cows (1 ≤ N ≤ 100,000) share many similarities. In fact, FJ has been able to na ...

  2. java怎样防止内存溢出

    引起内存溢出的原因有很多种,小编列举一下常见的有以下几种: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据:2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收:3.代码中存在死 ...

  3. abp架构中加载公共css样式表和公共js的文件目录位置

    src\shared\helpers\LocalizedResourcesHelper.ts

  4. 【手撸一个ORM】第十步、数据操作工具类 MyDb

    说明 其实就是数据库操作的一些封装,很久不用SqlCommand操作数据库了,看了点园子里的文章就直接上手写了,功能上没问题,但写法上是否完美高效无法保证,建议有需要的朋友自己重写,当然如果能把最佳实 ...

  5. Selenium----Selenium简单介绍以及Selenium IDE环境搭建,脚本录制

    1.selenium简单介绍 心得:作为一个新手开始了解这个工具,打算从录制脚本开始学习,“录制,看,学习,写”,总结网友说得打算先使用Selenium IDE录制学习,再使用Selenium RC开 ...

  6. jquery——样式操作

    思想:同一个函数完成取值和赋值 addClass.removeClass. <!DOCTYPE html> <html lang="en"> <hea ...

  7. MapReduce的输出格式

    1. OutputFormat接口 OutputFormat为输出格式接口,主要用于描述输出数据的格式,它能将输出的键值对写入特定格式的文件中.输出格式的层次结构如下 2. 文本输出 Hadoop默认 ...

  8. 【密码学】SSL双向认证以及证书的制作和使用

    客户端认证服务器: 正规的做法是:到国际知名的证书颁发机构,如VeriSign申请一本服务器证书,比如支付宝的首页,点击小锁的图标,可以看到支付宝是通过VeriSign认证颁发的服务器证书: 我们用的 ...

  9. SpringBoot | 第十章:Swagger2的集成和使用

    前言 前一章节介绍了mybatisPlus的集成和简单使用,本章节开始接着上一章节的用户表,进行Swagger2的集成.现在都奉行前后端分离开发和微服务大行其道,分微服务及前后端分离后,前后端开发的沟 ...

  10. HTML5 应用缓存和常规的 HTML 浏览器缓存有何差别?

    HTML5 的应用缓存最关键的就是支持离线应用,可获取少数或者全部网站内容,包括 HTML.CSS.图像和 JavaScript 脚本并存在本地.该特性加速了网站的性能,可通过如下方式实现: < ...