디스크 읽기 방식 (랜덤, 순차 I/O)
DB의 성능 튜닝은 어떻게 disk I/O를 줄이느냐가 관건일 때가 많다.
하드 디스크(HDD) vs 솔리드 스테이드(SDD)
SSD는 기존 HDD에 플래시 메모리를 장착하고 있다. 그래서 디스크 원판을 기계적으로 회전시킬 필요가 없어 데이터를 빠르게 읽고 쓰는 것이 가능하다.
플래시 메모리는 전원이 공급되지 않아도 데이터가 삭제되지 않고, 메모리(D-RAM)보다는 느리지만 HDD보다는 빠르다.
한 번에 많은 데이터를 읽는 “순차 I/O”에서는 SSD가 HDD과 비슷한 성능을 보인다. 하지만 “랜덤 I/O”가 훨씬 빠르다는 것이다.
DB 서버에서 순차 I/O 작업은 그다지 비중이 크지 않고 랜덤 I/O를 통해 작은 데이터를 읽고 쓰는 작업이 대부분이므로 SSD의 장점은 DBMS 저장소에 최적이라고 볼 수 있다.
랜덤 I/O와 순차 I/O
랜덤 I/O라는 표현은 HDD의 플래터(원판)을 돌려서 읽어야 할 데이터가 저장된 위치로 디스크 헤더를 이동시킨 다음 데이터를 읽는 것을 의미하는데, 순차 I/O 또한 이 과정은 같다. 그럼 어떤 차이가 있는가?
디스크에 데이터를 쓰고 읽는 데 걸리는 시간은 디스크 헤더를 움직여서 읽고 쓸 위치로 옮기는 단계에서 결정된다. 즉, 디스크의 성능은 디스크 헤더의 위치 이동 없이 얼마나 많은 데이터를 한 번에 기록하느냐에 의해 결정된다고 볼 수 있다.
디스크 원판을 갖지 않는 SSD에서는 랜덤, 순차 I/O의 큰 차이는 없을 것으로 예측하지만, 랜덤 I/O가 전체 처리량이 더 떨어진다.
랜덤 I/O:
특정 레코드나 데이터 블록을 찾기 위해 디스크 헤드를 여러번 이동해야 한다.
랜덤 I/O의 부하가 더 큼
3개의 페이지를 디스크에 기록하기 위해 3번 시스템 콜 요청 (디스크 헤드를 3번 이동)
인덱스를 통한 데이터 접근이나 조건이 포함된 쿼리 실행 시 발생
순차 I/O:
디스크의 연속적인 위치에서 읽거나 쓰는 방식이다. 즉, 데이터를 처음부터 끝까지 순서대로 접근한다.
디스크 헤드를 한 방향으로만 이동시키기 때문에 성능이 더 빠름.
3개의 페이지를 디스크에 기록하기 위해 1번의 시스템 콜 요청 (디스크 헤드를 1번 이동)
대량의 데이터를 처리할 때 효율적이며,
테이블 전체 스캔하는 경우 주로 사용
쿼리 튜닝의 목표
쿼리 튜닝의 목표는 랜덤 I/O 자체를 줄여주는 것이 목적이라고 할 수 있다. 여기서 랜덤 I/O를 줄인다는 것은 쿼리를 처리하는 데 꼭 필요한 데이터만 읽도록 쿼리를 개선하는 것을 의미한다.
쿼리 튜닝을 통해 랜덤 I/O를 줄이는 방법은 아래와 같다.
인덱스 사용: 적절하게 인덱스를 설정해서 필요한 데이터에 대한 접근을 빠르게 하고, 전체 테이블 스캔 회피
쿼리 최적화: 실행 계획을 분석하고, 불필요한 데이터 접근을 최소화하여 필요한 데이터만 읽도록 개선
캐싱 전략: 자주 조회되는 데이터를 메모리에 저장하여 디스크 접근을 줄이는 방법
index range scan은 주로 랜덤 I/O를 사용하며, full table scan은 순차 I/O를 시용한다. 그래서 큰 테이블의 레코드 대부분을 읽는 작업에서는 index를 사용하지 않고 full table scan을 사용하도록 유도할 때도 있다.
이는 순차 I/O가 랜덤 I/O보다 더 많은 레코드를 읽을 수 있기 때문인데, 이 형태는 OLTP 성격의 웹 서비스보다는 데이터 웨어하우스나 통계 작업에서 자주 사용된다.
Last updated