I/O上的等待事件 —— direct path read temp、direct path write temp

时间:2021-08-26 07:53:12

为了排序工作在临时区域读写时,等待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
1、应用程序层
检查需要排序的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%左右。