Oracle IO 유형

1. Conventional IO

- server process 가 Data Access 할때 'Buffer Cache'로 Access 

 - sever process가 Data 찾을려고  Buffer Cache LRU 를 먼저 본다 

 - 없으면

 - Disk 에서 해당 Block을 찾아서 Buffer Cache에 올린다 

 - server process는 Buffer Cache에 올라간 Data를 읽는다

- 단점

 - 대량의 Data를 읽을 경우 : 기존의 buffer cache에 pin된 Data를 out 시켜야함 + latch도 있고 

     

2. Direct IO

- buffer Cache 로 데이터를 올리지 않고 , server process가 direct로 Disk 에서 읽음 

 

Direct Path Read  하는 경우

 - 일정 크기 이상의 full scan

 - Create table AS select 구문 (Select)

 - Parallel Query 이용한 Full Scan 

Direct Path Write 하는 경우

 - insert 시 append 힌트를 줄 경우 - 기본은 conventional IO이지만 , 힌트 주면 direct IO로 수행됨

 - Create table AS select 구문 (Create)

 - parallel DML 

 

 

 

한번 disk 에서 읽을때 하나의 block 만 가져오는게 아니라 multi block으로 여러 block을 읽는다.

[hidden parameter] db_file_direct_io_count = ( def ) 1M

즉,  8K block을 128개 한번에 buffer cache로 가져옴 

 

 

 

 

Direct Path R/W Temp

servre process 가 정렬, hashing 작업 등으로 PGA 활용 할 때, 메모리가 부족할 경우 Temp Tablespace에 Read/Write 수행하면서 발생하는 Wait Event 

정렬해야할 데이터가 클 경우 

 

Direct Path Read Temp

Merge sort를 위해 temp에서 읽음 

 

Direct Path WriteTemp

PGA에서 1차 정렬하고 temp tablespace에 내림 

 

해결 방안 

1. PGA크기 늘리기 (V$PGA_TARGET_ADVICE 참고)

2. Temporary Tablespace의 I/O Throughput 증대 (SSD로 교체)

- SSD는 HDD 보다 random io는 굉장히 좋아지지만 (10배)

- IO throughput은  SSD가 50%정도 or 2배 정도만 좋아진다  

3. SQL튜닝  - 불필요한 정렬/해싱 제거 

  - 그렇다고 Hashh Join해야할걸 Nest Loop Join으로 하는 멍청한 짓은 하면 안된다