본문 바로가기

Data Engineering/OnPrem_DataBase

[DataBase] I/O 메커니즘 - 튜닝 지표

** 데이터 진흥원 - SQL 전문가 가이드의 [과목3-1장-3절] 내용

 

튜닝의 기준이 되는 I/O 관리 지표들에 대해 알아본다.


 

1) 블록

> 모든 데이터 이동은 블록 단위로 진행된다. 블록을 잘 관리해야 한다.

 

- 한 행을 읽어도 블록 단위로 읽는다 : 버퍼 캐시, 데이터 파일 모두 블록이 기본 단위

- 지표 01 : 논리적인 블록 읽기 량 (옵티마이저 판단의 가장 큰 지표), SQL 쿼리 작성 시부터 논리적으로 튜닝 필요


2) 메모리 I/O (버퍼 : 전기적 신호 : 빠름) vs 디스크 I/O (파일 : 물리적 움직임 : 느림)

> 메모리 I/O의 활용을 최대화시키는 것이 목표가 된다.

 

- 지표 02 : 버퍼 캐시 히트율(BCHR) : "버퍼 캐시에서 읽은 블록 수 / 전체 읽은 블록 수"

   ** 버퍼 캐시에 없어서 디스크를 읽어들여야 할 때도, 버퍼 캐시로 옮겨쓴 후 읽는다는 점을 명심할 것.

   ** 메모리에서 I/O를 하더라도 기본적으로 블록 읽기 량이 많은 경우에는 문제가 발생할 수 있다. 지표 01부터 관리

- 네트워크 기술(NAS, SAN), 파일시스템 캐시 크기도 고려해야 한다.


3) Sequential I/O (포인트 순서를 따라 읽기) vs Random I/O (무작위 읽기)

> 인덱스의 포인터를 따라 읽는 것, 디스크의 다음 공간을 읽는 것 등을 sequential I/O로 본다.

- 지표 03 : 시퀀셜 엑세스에 의한 선택 비중은 높이고 / 랜덤 엑세스 발생량은 줄인다. = "인덱스를 잘 구성하고 알맞게 쿼리해라"


4) single I/O (한 call에 한 블록만) vs MultiBlock I/O (한 call에 인접한 블록 전체를)

> 인덱스는 포인터로 연결되어 인접하게 저장되지 않지만, 대체로 동일한 테이블은 동일 익스텐트 내의 인접 블록에 저장된다.

- 지표 04 : 인덱스 스캔이 유리하면 single I/O를 쓰고, 전체 테이블을 읽을 때는 MultiBlock I/O를 사용하여 I/O call 횟수를 줄인다.

   ** MultiBlock I/O도 익스텐트를 넘어가진 않으며, Full Scan이 발생하면 defualt로 MultiBlock I/O가 적용된다.

   ** MultiBlock I/O로 버퍼 캐시에 써진 블록들은 우선적으로 메모리 상에서 밀려난다.


 

[정리 및 행동]

 

- 필요한 최소 블록만 읽도록 SQL 작성 : 중복으로 읽고 있는 것이 없는지 확인한다.

- 최적 옵티마이징 팩터 제공 : 인덱스/파티션/클러스터/윈도우 함수를 활용하고, 옵티마이저 설정과 통계의 정확도를 최적화한다.

- 필요 시, 힌트를 사용하여 최적 엑세스 경로 유도 : 옵티마이저가 예상보다 부정확하다면 힌트로 유도한다.