우리가 어떤 개발을 한다거나 SQL 문을 작성하고 실행할 때, '디스크'에 관해서 생각을 해본 적이 있는가?
데이터베이스와 디스크의 관계, 그리고 디스크에 읽고 쓴다 라는 개념을 자세히 생각이나 해본 적이 있을까?
이 책의 첫번째 챕터에서는 앞으로 장에서 오라클의 프로세스, 현상을 이해하는데 도움이 될 기본적인 디스크와 I/O 관계를 설명하고 있다.
글쓴이도 이렇게 말했다.
일반적으로 디스크와 I/O의 동작을 특별히 의식한 적은 없겠지만, 머릿속에서 동작을 그림으로 떠올릴 수 있다면 오라클에서 발생하는 여러 현상을 이해하기 수월할 것이다.
1. 디스크의 동작
오라클은 DBMS 이다. DBMS는 오라클이 디스크에 저장하고 관리하는 데이터를 의미한다.
오라클이 다루는 데이터는 디스크에서 꺼내오고 다시 디스크로 돌아간다.
디스크는 어떻게 동작할까?
추억 속의 레코드 판을 떠올려보자.
디스크와 턴테이블의 구조가 비슷하다고 한다.
나도 실제로 디스크를 분해해서 본적이 없어서 자세히는 모르겠지만, LP판 돌아가는거 상상하면 대충 어떻게 동작하는지 그림은 그려진다.

디스크는 데이터를 읽고 쓰기위해서는 원하는 데이터가 저장되기 시작한 첫머리를 반드시 찾아야한다고 한다.
이를 'seek' 탐색이라고 부른다.
그 후에 디스크에서 원하는 정보를 읽을 수 있는 위치가 회전해서 다가올 때까지 기다리다가 해당 위치가 다가오면 데이터를 읽고 쓴다.
2. 시퀀셜 액세스 (Sequential Access)
Sequential '순차'를 뜻하는 의미를 가지며, 시작점에서부터 마지막까지 전부 풀스캔하여 액세스(읽고,쓰기)하는 것을 의미한다.
메모리에 테이블의 데이터가 없으면 풀스캔(모든 데이터를 읽어오는 것)하는데, 이때 시퀀셜 액세스가 발생한다.
3. Index 인덱스
모든 테이블의 모든 데이터를 처음부터 끝까지 다 읽어온다면, 대기시간과 수행시간은 상당히 오래 걸릴 것이다.
그래서 나온 개념이 '인덱스'이다.
우리가 어떤 책에서 특정 정보를 얻으려고할 때, 책의 목차를 본다.
그 목차에는 각각 특정 정보의 주제와 해당 페이지가 함께 적혀있다.
우리는 필요한 정보만을 획득하기 위해서 바로 그 페이지가 있는 곳으로 가서 정보를 가져온다.
데이터베이스의 인덱스도 이와 비슷한 개념인 것이다.
책에는 키워드에 해당하는 페이지 번호가 있다면, 데이터베이스에는 키에 상응하는 주소값(정확히는 ROWID)이 있다고 보면 된다.
그렇다면, 인덱스가 많아진다면?
인덱스가 많아져서 해당 인덱스들을 또 다 조회해서 찾아야 한다면 동일하게 수행시간이 오래 걸린다는 문제가 생기지 않을까??
=> 결론적으로 그런일은 발생하지 않는다고 한다.

왜냐하면, 오라클의 인덱스는 '인덱스에 인덱스를 추가하는 것'처럼 여러 '계층'으로 구성되기 때문인 것.
이런 계층 구조를 트리 구조라고 하며, 장점은 인덱스의 필요 없는 부분을 읽지 않고 검색 작업을 끝낼 수 있다는 것이다.
4. 랜덤 액세스
내가 읽어오고 싶은 부분만 인덱스를 사용해서 읽어오면 좋겠지만,
내가 필요한 부분이 디스크 상에 연속적인 공간에 존재하기란 거의 불가능하다.
때문에 헤드를 여러번 움직여가며 띄엄띄엄 접근하게 되는데, 이러한 접근 방식을 '랜덤 액세스'라고 하는 것이다.
디스크 관점에서 보면, 이 방식은 굉장히 비효율적이라고 한다.
이를 음악 청취에 비유를 해놓았는데, 첫머리르 찾아가는 것을 빈번하게 반복하다 보니 한 시간 중 3분 정도밖에 음악을 듣지 못한 것으로 비유를 했다. 즉 나머지 57분은 낭비한 셈인 것.
재밌는 칼럼이 하나 적혀있어서 나도 기록해본다.
▶'시퀀셜'이란 어떤 의미인가?
시퀀셜 액세스는 'db file scattered read'라고 표시되고,
랜덤 액세스는 'db file sequential read'라고 표시된다.
여기서 scattered 는 '분산됐다'의 의미, 'sequential'은 '순차적인, 연속적인'이라는 의미를 가지고 있다.
액세스 하는 방식을 생각해보면, 의미가 반대로 된 것 아닌가? 하는 생각이 든다.
하지만, 이는 그렇게 정의한 이유가 있다.
** 오라클은 블록 단위로 데이터를 읽고 쓰며, 메모리에 배치된다 **
시퀀셜 액세스는 한 번에 여러 블록을 읽어온다.
이때 읽어온 여러 블록은 메모리상에 연속되지 않은 '분산된' 형태로 놓이게 된다.
그래서 'scattered'라고 표현하는 것이다.
반대로 랜덤 액세스는 한 번에 한 개의 블록 데이터를 읽어오며, 메모리 공간에 반드시 '연속적'으로 놓이게 된다.
그래서 'sequential'이라고 표현하는 것이다.
이렇게 한 번에 읽어온 데이터 블록을 메모리 상에 어떻게 배치하느냐에 따라 표현 방법을 다르게 한 것이다.
출처 : 스키타 아츠시 외 4명, 『그림으로 공부하는 오라클 구조』, 이민재, 제이펍(2022), p2-p15
** 이 책은 [그림으로 공부하는 오라클 구조] 책을 기반으로 정리된 글입니다.
스스로 공부 목적으로 기록하는 것에 중점을 두고 있습니다.**