DataBase/그림으로 공부하는 오라클 구조

1장 I/O와 디스크의 관계

우드의개발개발 2023. 9. 20. 15:54

오라클을 이해하기 위한 필수 키워드

  • 병렬 처리를 가능케 하고 높은 처리량을 실행한다.
  • 응답을 중시한다 (응답 속도 중시)
  • 커밋한 데이터는 지킨다 (데이터를 디스크에 기록한다)

 

위의 요소를 지키긴 간단하지 않다. 하나를 지키려고 하면 다른 무엇과 충돌하기 때문이다. 예를 들어 커밋하자마자 데이터를 디스크에 쓰게 되면 응답시간이 나빠지게 된다. 병렬 처리를 위해 락을 걸게되면 대기시간이 생겨 성능에 영향을 미치게 된다. 해당 책은 이런 상충관계에 있는 부분들이 서로 상충되지 않게 설계된 ORACLE DBMS의 구조를 개관적으로 설명한 책이다.

 

오라클과 하드 디스크

오라클이 디스크에 있는 데이터에 접근하는 방법

데이터베이스는 디스크에서 오라클이 관리하고 있는 데이터이다. 오라클은 디스크에 있는 데이터를 꺼내어 사용한다. 디스크의 구조를 살펴봄으로써 오라클이 디스크에 있는 데이터에 어떻게 접근하는지 살펴보자. 아래 동영상은 36초 부터 보면 된다.

https://www.youtube.com/watch?v=3owqvmMf6No&t=83s 

영상을보면  회전하는 디스크 와  움직이는 엑츄에이터로 데이터에 접근한다.

오라클이 디스크에 있는 데이터에 접근하는 방법

통상(?) 디스크는 1초에 10000번을 회전하고 액츄에이터100번 움직일 수 있다고 하자. 액츄에이터가 원하는 포지션을 찾으면 메모리에 접근하는데 이 때 걸리는 시간은 0.001초이다. 그럼 액츄에이터가 데이터를 찾는데 걸리는 시간은 아래와 같다.

액츄에이터가 데이터를 찾는 시간 = 디스크를 기다리는 시간 + 액츄에이터 암이 움직이는 시간 + 메모리에 접근하는 시간

디스크를 기다리는 시간을 0이라고 했을 때 하나의 데이터를 찾는데 약 0.011초가 소요된다. CPU가 메모리에 접근하는 시간이 10억분의 1초와 비교하면 차이가 크다. 따라서 I/O의 대기 시간을 줄이는 방법을 탐색해야 한다.

 

액세스

시퀀셜 액세스와 랜덤 액세스

시퀀셜 엑세스는 풀스캔(테이블의 모든 데이터를 읽어오는 작업)이 일어날 때 발생한다. 디스크 동작으로 시퀀셜 액세스를 이해한다면 액츄에이터 암의 첫번째 시크 후 이동 없이 디스크에 있는 데이터를 읽고 쓰는 작업을 수행한다. 시크가 없기 때문에 1초에 20MB 크기의 데이터를 읽고 쓸 수 있다.

 

이에 반해 랜덤 엑세스는 풀스캔이 아닌 인덱스를 통한 데이터 탐색이 일어날 때 발생한다. 랜덤 액세스시 각각의 데이터의 위치는 디스크에서 불연속적이기 때문에 시크현상이 발생한 후(0.01초), 한번 디스크에 접근할 때 4KB 정도 읽어 올 수 있다면 1초에 400KB(4KB * 100)정도 데이터를 읽어올 수 있다.

 

랜덤 액세스가 1초에 20MB 데이터에 접근할 수 있는 것과 달리 랜덤액세스의 경우 1초에 400KB 데이터에 접근할 수 있다. 랜덤 액세스는 OLTP(Online Transaction Processing) 시스템에서 발생한다. 온라인으로 콘서트 티켓을 예매하는 것과 같은 요청인데 해당 요청의 특징은 크지 않은 데이터를 즉시 처리해야하는 것으로 랜덤 액세스 방식으로 I/O 처리를 한다. 그래서 IOPS(Input Output Operations Per Second) 성능이 중요하다.

 

찾으려는 데이터의 크기가 크면 시퀀셜 액세스가 랜덤 액세스보다 빠르다?

1초에 20MB I/O 성능을 내는 풀스캔이기 때문에 접근하려는 찾으려는 데이터가 전체 데이터의 15%를 초과 할 경우 풀스캔이 인덱스보다 빠를 수 있다. 15% 수치는 계산된 값이다.

 

db file sequential read 와 db file scattered read

전자는 단일 I/O 수행 시 발생한다. 해석하면 "단일 블록을 찾아서 메모리에 연속적으로 배치했어"

 

후자는 멀티 I/O 수행 시 발생한다. 그렇게 해서 찾은 블록을 비연속적으로 메모리에 배치하기 때문에 scattered라는 표현을 사용한다. 해석하면 "여러 블록을 읽어서 메모리에 불연속적으로 배치했어"

 

Index

Oracle DBMS 인덱스의 자료구조에 대해 알아보자. 인덱스에는 여러가지 형태의 자료구조가 사용된다. B*-tree index, Reverse key index, Bitmap index, Function-based index 등이 있다. 그 중에서 B-tree index에 대해서 알아보았다.

B*-tree index 특징

  • 테이블 내 필드를 단일 또는 복수로 묶어 인덱스를 형성한다.
  • 인덱스를 형성할 경우, 인덱스 테이블이 생기고 기존 테이블 내 데이터 중에서 인덱스를 형성한 필드의 데이터를 모두 가지고 온다. 이 때 특정 필드를 기준으로 값을 오름차순으로 정렬해서 행을 정렬한다.
  • 오름차순으로 정렬했기 때문에, SQL 문을 사용해 특정 행을 찾을 경우 이진 탐색으로 해당 값을 찾는다. 그래서 O(logn)의 시간 복잡도를 가진다.
  • 인덱스 테이블이 갖는 특징은 해당 열이 기존 테이블의 특정 로우에 대한 위치값을 값으로 가지고 있다는 점이다.