5._Direct_Path_IO
2012.05.21 13:09
- 일반적 블록 I/O DB 버퍼 캐시 경유
- 읽고자 하는 블록을 버퍼 캐쉬 확인후 없을경우 디스크 에서 읽음
- 변경역시 버퍼 캐시에서 이루어지며 dbwr 프로세스가 dirty 블록을 기록
- 시스템 전반의 I/O 성능 향상
- 개별 프로세스입장에서는 좋지 않음
- Direct Path I/O
- 버퍼 캐시를 경유하지 않고 데이터 블록을 읽고 쓰는 기능
- Temp 세그먼트 블록들을 읽고 쓸때
- 병렬 쿼리로 Full Scan을 수행할때
- nocache 옵션을 지정한 LOB 컬럼을 읽을때
- direct 옵션을 지정하고 export 를 수행할때
- parallel DML 을 수행할때
- Direct Path Insert 를 수행할때
(1) Direct Path Read/Write Temp
- 데이터 정렬시 PGA메모리의 Sort Area를 이용
- 정렬 데이터가 많을경우 Temp 테이블 스페이스를 사용
- Sort Area에 정렬된 데이터를 Temp 테이블스페이스에 쓰고 읽을때 Direct Path I/O 방식사용
Session altered.
SQL> create table ta as select * from all_objects;
Table created.
SQL> alter session set workarea_size_policy=manual;
Session altered.
SQL> alter session set sort_area_size=5224288;
Session altered.
SQL> select *
2 from (
3 select a.*, rownum no
4 from (select * from ta order by object_name) a
5 )
6 where no <=10;
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 110 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2 0.30 0.51 1060 1037 3 10
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 4 0.31 0.51 1060 1147 3 10
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: SYS
Rows Row Source Operation
------- ---------------------------------------------------
10 VIEW (cr=1037 pr=1060 pw=1060 time=0 us cost=2615 size=9571554 card=55974)
72407 COUNT (cr=1037 pr=1060 pw=1060 time=330632 us)
72407 VIEW (cr=1037 pr=1060 pw=1060 time=221959 us cost=2615 size=8843892 card=55974)
72407 SORT ORDER BY (cr=1037 pr=1060 pw=1060 time=118412 us cost=2615 size=8843892 card=55974)
72407 TABLE ACCESS FULL TA (cr=1037 pr=0 pw=0 time=81744 us cost=394 size=8843892 card=55974)
Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
SQL*Net message to client 2 0.00 0.00
Disk file operations I/O 1 0.00 0.00
direct path write temp 42 0.02 0.22
direct path read temp 845 0.00 0.01
SQL*Net message from client 1 0.00 0.00
(2) Direct Path Read
- 병렬 쿼리로 Full Scan 수행시 Direct Path Read
- 병렬도 (DOP)를 2 -> 병렬쿼리 수행 ->수행속도 2배이상
- 읽기 Call 이 완료될때 까지 대기가 발생 -> direct path read 이벤트 로 측정
- Direct Path Read를 수행하려면 메모리와 디스크간 동기화를 먼저 수행 -> Dirty 버퍼 해소
- 10gR2이전 -> 병렬쿼리 수행시 체크포인트를 통해 버퍼 캐시 전체를 데이터파일에 기록
- 10gR2이후 -> 병렬쿼리와 관련된 세그먼트만 동기화 수행
- Adaptive Direct Path Reads
- 오라클 8.1.5 이후 -> 병렬쿼리가 아니라도 Direct Path Read 가능
- _serial_direct_read true : 변경
- 11g 부터 이파라미터가 false인 상태에서 Serial Direct Path Read 방식이 작동 할수도 있음
- 이미 캐싱돼 있는 블록 개수, 디스크에 기록해야 할 Dirty 블록 개수
(-> 세그먼트 단위 체크포인트 일량을 결정) 등
(3) Direct Path Write
- 병렬로 DML을 수행하거나 Direct Path Insert 방식으로 데이터를 insert할때 사용
- I/O Call 발생시마다 direct path write 이벤트
- Direct Path Insert 방식으로 데이터 입력하는 방법
- insert … select 문장에 /*+append*/ 힌트사용
- 병렬 모드로 insert
- direct 옵션을 지정하고 SQL*Loader(sqlldr)로 데이터를 로드
- CTAS (create table … as select )문장을 수행
- 일반적인 insert시
- Freelist를 통해 데이터를 삽입할 블록을 할당
- Freelist 조회하면서 Random 액세스 방식으로 버퍼 캐시에서 해당 블록 찾음
- 없다면 데이터파일에서 읽어 캐시에 적재
- 데이터 삽입
- 대량의 데이터 insert 시 매우 느림
- Direct Path Insert 시
- Freelist를 참조하지 않고 테이블 세그먼트 또는
각 파티션 세그먼트의 HWM (High-Water Mark) 바깥 영역에 데이터를 순차적으로 입력 - Freelist로 부터 블록 할당 작업 생략, insert 할 블록을 버퍼 캐시에 적재하지 않음
- 직업 insert로 인해 속도가 빠름
- HWM 바깥 영역에 데이터 입력 Undo 발생량도 최소화
- HWM 뒤쪽에 입력한 데이터는 커밋전가지 다른 세션에 읽히지 않음
(undo 필요없음,롤백시 딕셔너리 정보만 롤백하면 됨) - Redo 로그까지 최소화 (데이터딕셔너리 변경사항만 로깅) 하도록 옵션을 줄수 있음
-> 더 빠른 isnert 가능 -> nologging
alter table t NOLOGGING;
insrt into t NOLOGGING select * from test; <- X 아무 의미 없음
- insert 문을 로깅하지 않도록 하는 방법 없음
- Direct Path Insert 방식으로 데이터를 입력하면 Exclusive 모드 테이블 Lock이 발생
alter session enable parallel dml;
delete /*+ parallel(b 4) */ from big_table b; -> Exclusive 모드 TM Lock!!
- Exclusive 모드 테이블 Lock을 사용하면 해당 테이블에 다른 트랜잭션의 DML 수행을 막음
(일반 DML은 Row Exclusive 모드 테이블 LOCK 사용 다른 트랜잭션의 DML 막지 않음)
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
66 | 부록 | 남송휘 | 2012.06.05 | 2709 |
65 | 8._IO_효율화_원리 | 운영자 | 2012.06.05 | 4427 |
64 |
3._Deterministic_함수_사용_시_주의사항
![]() | 정찬호 | 2012.05.29 | 4352 |
63 | 2._Cursor_Sharing | 운영자 | 2012.05.28 | 6277 |
62 | 7._Result_캐시 | 운영자 | 2012.05.27 | 4427 |
61 |
3._Single_Block_vs._Multiblock_IO
![]() | 정찬호 | 2012.05.22 | 4230 |
60 |
2._Memory_vs._Disk_IO
![]() | 정찬호 | 2012.05.22 | 4447 |
59 |
1._블록_단위_IO
![]() | 정찬호 | 2012.05.22 | 4212 |
58 |
6장._IO_효율화_원리
![]() | 정찬호 | 2012.05.22 | 4086 |
57 |
1._Library_Cache_Lock_Pin
![]() | 남송휘 | 2012.05.21 | 4291 |
56 |
6._RAC_캐시_퓨전
![]() | 남송휘 | 2012.05.21 | 17798 |
» | 5._Direct_Path_IO | 남송휘 | 2012.05.21 | 7933 |
54 |
4._Prefetch
![]() | 남송휘 | 2012.05.21 | 3890 |
53 | 8._PLSQL_함수_호출_부하_해소_방안 | 남송휘 | 2012.05.21 | 3774 |
52 | 5._Fetch_Call_최소화 [1] | 박영창 | 2012.05.15 | 6066 |
51 |
7._PLSQL_함수의_특징과_성능_부하
![]() | 남송휘 | 2012.05.14 | 6936 |
50 | 6._페이지_처리의_중요성 | 남송휘 | 2012.05.14 | 3380 |
49 | 4._Array_Processing_활용 | 시와처 | 2012.05.13 | 4044 |
48 |
3._데이터베이스_Call이_성능에_미치는_영향
![]() | 시와처 | 2012.05.13 | 3646 |
47 |
10._Dynamic_SQL_사용_기준
![]() | 남송휘 | 2012.05.07 | 4557 |