1.direct path read temp
select TOTAL_BLOCKS,USED_BLOCKS from v$sort_segment;
看看是不是在不段增加
select * from v$sysstat where NAME LIKE '%workarea executions%';
看看是不是在不段增加
select operation_id,operation_type,actual_mem_used,tempseg_size,tablespace
from v$session s,v$sql_workarea_active w
where s.sid=w.sid
and S.SID=?
2.
http://blog.csdn.net/zq9017197/article/details/7940984
为了排序工作在临时区域读写时,等待direct path read temp、direct path write temp事件。这个等待事件收从oracle 10g起被分类的,oracle 9i为止是通过direct path read、direct path write等待观察的。排序段上的 direct path I/O是在需要排序的数据比排序所分配的PGA内存区大时发生的。因此在排序工作时若大量发生direct path read temp、direct path write temp等待,就可以通过追加分配内存区域而避免等待。
- SQL> select event#,name,parameter1,parameter2,parameter3 from v$event_name where name = 'direct path read temp';
- EVENT# NAME PARAMETER1 PARAMETER2 PARAMETER3
- ---------- ------------------------------ --------------- --------------- ---------------
- 195 direct path read temp file number first dba block cnt
- SQL> select event#,name,parameter1,parameter2,parameter3 from v$event_name where name = 'direct path write temp';
- EVENT# NAME PARAMETER1 PARAMETER2 PARAMETER3
- ---------- ------------------------------ --------------- --------------- ---------------
- 197 direct path write temp file number first dba block cnt
检查需要排序的sql语句是否已经最优化。不必要的排序操作会导致CPU浪费、PGA区域浪费、磁盘I/O浪费。从UNION和UNION ALL的性能差异上可以得知,只靠减少不必要的排序操作,也能解决许多问题。
2、oracle内存层
在进程上分配的工作区大小内一次性实现的排序称为One pass sort。与此相反的情况称为Multi pass sort。发生Multi pass sort时,排序工作过程中将排序结果读写到排序段(sort segment)区域,因此发生direct path read temp、direct path write temp等待。如果该等待大量发生,就可以适当提高pga_aggregate_target值,以此消除问题。
oracle在调优指南上推荐如下设定pga_aggregate_target值。
OLTP:pga_aggregate_target=(total_mem * 80%) * 20%
OLAP:pga_aggregate_target=(total_mem * 80%) * 50%
上述的意思是,假设OS本身使用20%左右的内存,OLTP系统上使用剩余内存的20%左右,OLAP系统因为排序工作较多,所以使用剩余内存的50%左右。