Oracle Hint 之 Append
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的更多相关文章
- SQL优化过程中常见Oracle HINT
在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见Oracle HINT的用法: 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量, ...
- Oracle hint手动优化
例子 select/*+FULL(fortest)*/ * from fortest where id = 2000000 //使用0.70s时间 select* from fortest where ...
- 品味性能之道<十>:Oracle Hint
Hint 是Oracle 提供的一种SQL语法,它允许用户在SQL语句中插入相关的语法,从而影响SQL的执行方式. 因为Hint的特殊作用,所以对于开发人员不应该在代码中使用它,Hint 更像是Ora ...
- SWAP_JOIN_INPUTS Oracle Hint(处理hash join强制大表(segment_size大)作为被驱动表)
SWAP_JOIN_INPUTS Oracle Hint(处理hash join强制大表(segment_size大)作为被驱动表) swap_join_inputs是针对哈希连接的hint,它的含义 ...
- Oracle Hint 用法
正确的语法是: select /*+ index(x idx_t) */ * from t x where x.object_id=123 /*+ */ 和注释很像,比注释多了一个“+”,这就是 ...
- Oracle Hint 详解
Hint 是Oracle 提供的一种SQL语法,它允许用户在SQL语句中插入相关的语法,从而影响SQL的执行方式. 因为Hint的特殊作用,所以对于开发人员不应该在代码中使用它,Hint 更像是Ora ...
- oracle --hint总结
得到一条sql语句执行计划的常用方法:1.explain plan 命令 2.DBMS_XPLAN包3.sqlplus中的AUTOTRACE开关4.10046事件5.10053事件6.AWR报告或者 ...
- 【DBAplus】SQL优化:一篇文章说清楚Oracle Hint的正确使用姿势
原创 2016-09-12 韩锋 作者介绍 韩锋,宜信技术研发中心数据库架构师.精通多种关系型数据库,曾任职于当当网.TOM在线等公司,曾任多家公司首席DBA.数据库架构师等职,多年一线数据库架构. ...
- SQL优化:一篇文章说清楚Oracle Hint的正确使用姿势
一.提示(Hint)概述 1为什么引入Hint? Hint是Oracle数据库中很有特色的一个功能,是很多DBA优化中经常采用的一个手段.那为什么Oracle会考虑引入优化器呢?基于代价的优化器是很聪 ...
随机推荐
- [USACO09FEB]庙会班车Fair Shuttle 线段树维护maxx&&贪心
题目描述 Although Farmer John has no problems walking around the fair to collect prizes or see the shows ...
- 3、python数据类型之字符串(str)
字符串是任何计算机语言中最常见的数据类型,python中也不例外,因此熟练掌握字符串是学习python的必备技能.python中字符串三种定义方式 str = 'wang' str = "w ...
- poj1082 Calendar Game (博弈)
题意是:Adam和Eve两人做游戏,开始给出一个日期,截止日期是2011.11.4,游戏规则如下: 每个人只能将天数增加一天或者将月份增加一天.如果下个月没有这一天,那么只能增加天数. 游戏胜利定义为 ...
- Oracle存储过程实例分析总结(代码)
1.存储过程结构 1.1 第一个存储过程 ? 1 2 3 4 5 6 7 8 9 10 11 12 CREATE OR REPLACE PROCEDURE proc1 ( para1 varc ...
- mysql CPU占用高
https://blog.csdn.net/u011239989/article/details/72863333 QPS高,sql简单的场景下, 需要 1. 提高数据库的服务器性能CPU 内存等 2 ...
- OpenStack Weekly Rank 2015.07.20
Module Reviews Drafted Blueprints Completed Blueprints Filed Bugs Resolved Bugs Cinder 8 1 3 9 10 Sw ...
- Python3.5 控制台日志输出,区分标准输出与错误输出
import logging import sys class ConsoleHandler(logging.Handler): terminator = '\n' def __init__(self ...
- Maven的学习资料收集--(三)使用Maven构建Web项目
新建Maven项目 File - New - Other 选择Maven Project 单击Next 保持默认即可单击Next 选择Archetype为 web app单击Next 输入一些必要信息 ...
- drools的error:Jboss rule 6.4.0 Cannot find a default StatelessKieSession
drools的kmodule.xml文件,如果是默认加载必须放在META-INF的文件夹下,如下图 官网大佬原话 Have you defined kieSession and KieBase nam ...
- .net core mvc全局设置跨域访问
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory ...