1. direct path read 대기이벤트

1. Parallel Query 수행시 슬레이브 세션(Slave Session)이 수행하는 direct path I/O에 의해 발생한다.
2. 슬레이브 세션이 direct path read를 수행하는 동안 코디네이터 세션(Coordinator Session)은 슬레이브 세션으로부터 응답이 오기를 기다리며 PX Deq: Excute Reply 이벤트를 대기하는 것으로 관찰된다.
3. Parallel Query 수행시 발생하는 direct path read 대기는 필연적이다.
4. P1=file#, P2=시작 block, P3=블록수
5. 버퍼 캐시와 관련된 경합이 발생하는 경우 이를 피하기 위한 방법으로 활용가능하다.

참고) direct path I/O 발생하는 경우

1. 정렬작업을 위해 정렬 세그먼트(Sort segment)를 읽고 쓰는 경우. direct path read temp, direct path write temp 이벤트를 대기한다.
2. Parallel Query를 위해 데이터파일을 읽는 경우. direct path read 이벤트를 대기한다.
3. PDML이나 CTAS를 위해 데이터파일을 쓰는 경우. direct path write 이벤트를 대기한다.
4. NOCACHE 속성으로 생성된 LOB 세그먼트를 읽고 쓰는 경우. direct path read(lob), direct path write(lob) 이벤트를 대기한다.
5. I/O 시스템이 데이터를 읽어서 오라클에 반환하는 속도보다 훨씬 빠른 속도로 버퍼를 요구할 때. 이 경우 오라클 성능개선을 위해 readahead I/O(이후에 읽을 것으로 판단되는 데이터를 미리 한꺼번에 읽는 I/O 작업을 말함)를 이용한다. 이 경우 direct path read 이벤트를 대기한다.

2. direct path read 대기이벤트 해결책

1. direct path read 대기는 필연적인 것으로 Parallel Query의 성능을 높인다

  • 데이터 파일에 대해 직접 읽기 작업을 수행하기 전에 읽기의 대상이 되는 객체의 더티 블록이 데이터 파일에 기록된다. 즉 체크포인트가 발생하게 되고, 코디네이터 세션은 enq: TC - contention 대기이벤트를 발생한다.

2. I/O 시스템의 성능을 높인다.

  • 오라클에서의 I/O 작업 레이어
    • 어플리케이션 레이어 : select/insert/update/delete/truncate...
    • 오라클 메모리 레이어: Buffer cache | PGA
    • 오라클 세그먼트 레이어: Datafile, tempfile, Tablespace, Segment
    • OS/디바이스 레이어: Asynch I/O, Direct I/O, Raw device, RAID, ...

3. _DB_FILE_DIRECT_IO_COUNT 의 조정

  • direct path I/O에서의 최대 I/O 버퍼 크기를 결정한다. 오라클 9i부터 이 값은 기본적으로 1M의 값을 가진다. 하지만 실제로는 O/S나 하드웨어 설정에 따라 최대값이 결정된다.
  • 이 값을 높이면 Parallel Query의 성능이 높아질 수도 있으나, 대부분 실제 사용가능한 값은 1M보다 작은 값이므로 실제로는 변경할 필요가 없다.

3. direct path read와 undo

  • direct path read가 비록 데이터파일에서 직접 데이터를 읽지만, 언두를 참조하는 메커니즘은 동일하다.
  • direct path read는 SGA를 경유하지 않을 뿐, 읽기 일관성(Read consistency)을 보장하는 방법은 동일하다.
  • 작은 언두 테이블스페이스(Undo tablespace)를 생성한 후, Parallel Query를 수행하면서 다른 세션에서 DML을 과다하게 수행할때 ORA-01555(Snapshot too old)에러가 나는 것이 관찰된다.
    • 곧 PQ 슬레이브 세션이 데이터파일에 대해 direct read를 수행하면서 변경된 블록을 발견하면 언두 데이터를 참조하는 것으로 해석할 수 있다.
{code}
ERROR at line 1:
ORA-12801: error signaled in parallel query server P002
ORA-01555: snapshot too old: rollback segment number 68 with name "_SYSSMU68$" too small
{code}

4. direct path read 대기 이벤트가 발생하는 데이터 파일 확인 스크립트

1. 하나의 세션에서 PQ를 수행한 후, PQ가 수행되는 동안 다른 세션에서 V$SESSION_WAIT 뷰를 조회해서 P1 값을 얻으면 어떤 파일에 대한 direct path read 인지 알 수 있다.

{code}
set serveroutput on size 100000
declare
begin
for px in (select * from v$px_session where qcsid = 세션ID )
loop
for wait in (select * from v$session_wait where sid = px.sid and event like '%direct path read%')
loop
dbms_output.put_line('SID='
wait.sid', P1='wait.P1);
end loop;
end loop;
end;
/

SQL>exec print_table('select * from v$datafile where file# = :P1값 ');

|


 



h2. 문서에 대하여

* 최초작성자 : [~kwlee55]
* 최초작성일 : 2011년 01월 06일
* 이 문서는 [오라클클럽|http://www.gurubee.net] [코어 오라클 데이터베이스 스터디|5차 코어 오라클 데이터베이스 스터디] 모임에서 작성하였습니다.
* {color:blue}{*}이 문서의 내용은 (주)엑셈에서 출간한 'PRACTICAL OWI IN ORACLE 10G'와 'Advanced OWI in Oracle 10g'를 참고하였습니다.*{color}