第一篇《oracle等待事件1分别用表和索引上数据的访问来产生dbfilescatteredread等待事件》http://leonarding.blog.51cto.com/6045525/1105411第二篇《oracle等待
第一篇 《oracle等待事件1分别用表和索引上数据的访问来产生db file scattered read等待事件》
第二篇 《oracle等待事件2构造一个DB File Sequential Read等待事件和构造一个Direct Path Read等待事件》
第三篇 《oracle等待事件3构造一个Direct Path write等待事件和构造一个Log File Sync等待事件》
Dear All:
历经5天的oracle等待事件系列大功告成,不容易a多少个不眠之夜,多少次无尽猜想,在此做首打油诗留念
《2012终日有感》
壮志未酬oracle
夜点明灯苦用功
只为不白少年头
报答老师抱mm
五构造一个Direct Path write等待事件,等待事件需要在v$session_wait和10046 trace文件中显示出来,贴出整个演示过程。
Direct path write 等待事件:发生在“写入磁盘”的时候,因为写也是一种中间状态,只要是中间状态数据就没有必要共享给其他用户,所以这些数据也不会放在SGA中共享,从PGA中 -> 直接写入 -> 磁盘。
场景: append方式插入数据,这种方式插入数据的时候会跳过SGA的data_buffer_cache,直接插入数据文件,并且还不会扫描数据文件中的空闲空间直接插入到文件尾所以效率较高
当数据排序时候,如果PGA被装满,香港虚拟主机,就会被写入到磁盘的temp表空间里,美国服务器,因为排序的数据是中间状态也不会经过SGA,所以会产生“direct path write”等待事件
LEO1@LEO1> select table_name,index_name from user_indexes where table_name='LEO1'; 利用leo1表
TABLE_NAME INDEX_NAME
------------------------------ -------------------------------------------
LEO1 IDX_LEO1
LEO1@LEO1> select count(*) from leo1; 有71959行记录
COUNT(*)
------------------
71959
LEO1@LEO1> execute dbms_stats.gather_table_stats(ownname=>'LEO1',tabname=>'LEO1',cascade=>TRUE);
PL/SQL procedure successfully completed. 统计分析
v$session_wait视图中显示出来
LEO1@LEO1> set serveroutput on
LEO1@LEO1> create or replace procedure p4
as
begin
for i in 1..8
loop
insert /*+ append */ into leo1 select * from leo1;
rollback;
end loop;
dbms_output.put_line('successfully');
end;
/
2 3 4 5 6 7 8 9 10 11
Procedure created.
创建存储过程p4循环8次,添加了append hint执行直接插入,在这个期间会发生“direct path write”等待事件
Append 注意事项
Append方式叫做直接路径加载,使用这种方式是因为oracle不会在扫描freelist链表中的空闲块,直接在高水线之后插入数据,所以速度比较快。
(1)append方式不记录redo,一旦在插入的过程中没有保存到磁盘或者发生掉电情况那么插入的数据不能恢复
(2)由于不在利用表的空闲空间,那么这种方式比较浪费存储空间,就是以空间换时间
(3)insert /*+ append */ into leo1 select * from leo1;会对这个表添加一个6级锁,意味着在没有commit/rollback前提下任何会话 insert update delete select 等操作都不允许,否则会报错
ORA-12838: cannot read/modify an object after modifying it in parallel
解释如下: