1. SQL 처리과정과 I/O - c. 데이터 저장 구조 및 I/O 메커니즘
SQL이 느린 이유는 디스크 I/O 때문이다
프로세스가 일하지 않고 잠을 자는 이유는 여러가지가 있지만 디스크 I/O가 가장 대표적이고 절대 비중을 차지한다.
1.3.2 데이터베이스 저장구조
데이터를 저장하려면 테이블 스페이스를 생성해야한다.
테이블 스페이스는 세그먼트를 담는 콘테이너로서 여러개의 데이터파일(디스크 상의 물리적인 OS파일)로 구성된다.
세그먼트는 여러 익스텐트로 구성된다.
* 세그먼트: Oracle 데이터베이스에서 데이터가 저장되는 물리적인 저장 단위
* 익스텐트: Oracle 데이터베이스에서 연속된 데이터 블록(Data Block)들의 집합
* 블록: 데이터를 읽고 쓰는 단위
오라클은 기본적으로 8KB 크기의 블록을 사용하므로 1Byte를 읽기 위해 8KB를 읽는 셈이다.
테이블 뿐만 아니라 인덱스도 블록 단위로 데이터를 읽고 쓴다.
1.3.4 시퀀셜 액세스 vs 랜덤 액세스
테이블 또는 인덱스 블록을 액세스(읽는)하는 방식으로는 시퀀셜 액세스와 랜덤 액세스 두가지가 있다.
1. 시퀀셜 액세스: 논리적 또는 물리적으로 연결된 순서에 따라 차례대로 블록을 읽는 방식.
2. 랜덤 액세스: 놀리적, 물리적인 순서를 따르지 않고, 레코드 하나를 읽기 위해 한 블록씩 접근 하는 방식.
1.3.5 논리적 I/O vs 물리적 I/O
DB버퍼캐시
자주 읽는 블록을 매번 디스크에서 읽는 것은 매우 비효율적임. 모든 DBMS에 데이터 캐싱 메커니즘이 필수이다.
1.3.6 Single Block I/O vs Multiblock I/O
메모리 캐시가 클수록 좋지만, 캐시에 모든데이터를 적재할 순 없음.
캐시에서 찾지 못한 데이터 블록은 I/O Call을 통해 디스크에서 DB버퍼캐시로 적재하고서 읽는다.
한번에 한블록씩 요청해서 메모리에 적재하는 방식을 'Single Block I/O'라고 하고 한 번에 여러 블록씩 요청해서 메모리에 적재하는 방식을 'Multiblock I/O'라고 한다.
DBMS에서 읽고자 하는 블록을 DB 버퍼캐시에서 찾지 못하면 해당 블록을 디스크에서 읽기 위해 I/O Call을 한다.
단일 블록 I/O: 한 번에 하나의 블록만 읽기 때문에, 여러 차례 디스크 접근이 필요함 → 성능 저하
Multiblock I/O: 한 번에 여러 블록을 읽어, I/O Call 횟수를 줄이고 대기 시간을 줄임 → 성능 향상
대용량 테이블의 Full Scan 시, Multiblock I/O 단위를 크게 설정하면 한 번의 I/O 작업에서 더 많은 데이터를 읽어들일 수 있어 성능이 개선됨.
특히, I/O 대기 시간을 줄여 전체 조회 속도가 빨라지기 때문에, 대용량 테이블을 처리할 때 효율적이다.
1.3.7 Table Full Scan VS Index Range Scan
Table Full Scan: 테이블에 속한 블록 '전체'를 읽어서 사용자가 원하는 데이터를 찾는 방식
Index Range Scan: 인덱스에서 '일정량'을 스캔하면서 얻은 ROWID로 테이블 레코드를 찾아가는 방식.
*ROWID는 테이블 레코드가 디스크 상에 어디에 저장됐는지를 가리키는 위치 정보.
1.3.8 캐시 탐색 메커니즘
Direct Path I/O를 제외한 모든 블록 I/O는 메모리 버퍼 캐시를 경유함.