안녕하세요, 인덱스 관련 공부를 하다 정확히 잘 나와있지 않는 부분에 대해 질문드립니다.
index를 통한 table access시에는 random i/o가 일어나고, disk access시에는 single block i/o가 일어난다고 서적에서 읽게 되었는데
제가 이해하기로는
index를 통한 table access=이미 data가 data buffer cache에 올라와 있는 상태에서 index의 rowid를 통해 data buffer cache에 접근
index를 통한 disk access=data가 data buffer cache에 올라와 있지 않은 상태에서 index의 rowid를 통해 data buffer cache에 data block를 올리고 접근
이라고 이해 했습니다. 정확히 맞는지, 아니라면 오해하고 있는 부분이 어딘지 궁금합니다.
또한 index의 rowid를 통해 랜덤한 위치에 저장된 data를 찾아가는 것에서 random i/o가 발생하는 것이 납득이 되나
table full scan을 통해 sequential i/o가 일어난다고 하는 부분이 잘 납득이 되지 않습니다.
데이터 자체는 랜덤한 위치에 저장되어 있는데 table full scan을 한다고해서 sequential i/o가 일어나는 이유를 잘 모르겠습니다.
확인 해주시면 감사하겠습니다!
뭔가 용어가 뒤죽박죽 섞여서 비교하고 있는 느낌입니다.
"index를 통한 table access시에는 random i/o가 일어나고," <-- 여기까진 맞는 말인데.
"disk access시에는 single block i/o가 일어난다" <-- 이부분은 비교 대상이 완전 잘못 된 듯 하네요.
table access 와 disk access 를 비교하는 것이 이상하네요.
disk access 는 memory access 와 비교해야 하고
single block i/o 는 multi block i/o 와 비교해야 하는데.
disk access 와 single block i/o 는 전혀 연관성이 없습니다.
모든 데이터는 메모리를 통해 읽습니다. memory access
메모리에 없으면 디스크에서 읽어서 메모리로 올린 다음 읽습니다. disk access
인덱스 스캔은 single block i/o, random i/o
테이블 풀스캔은 multi block i/o, sequential i/o
예를 들면 1번부터 10번까지 10개 블럭으로 이루어진 테이블이 있으면
테이블 풀스캔 : (1,2,3,4), (5,6,7,8), (9,10) 순차적으로 멀티블럭
인덱스 스캔 : 1, 10, 5, 8, 3, 4 ... 렌덤 순서로 싱글 블럭
인덱스는 수직탐색(↓) 과정으로 접근한뒤
리프노드에서는 수평탐색(→)으로 순차적으로 접근합니다. 싱글블럭
리프노드에 저장되어 있는 rowid를 이용해 테이블에 접근하게 되는데.
이 때 테이블에 접근하는 형태가 순차적이지 않아서 random i/o 라고 합니다.
random i/o 는 메모리에서 읽을지 디스크에서 읽을지와는 상관이 없습니다.
random i/o 는 인덱스 스캔을 통해 테이블에 접근할 때 발생합니다.
(싱글이냐 멀티냐)도 (메모리냐 디스크냐)와 상관이 없습니다.
서로 연관이 없는 것을 연관지으려고 해서 헷갈리시는 것 같습니다.
1. 싱글 vs 멀티
- 한번에 읽는 블럭의 량에 따라 정해집니다.
- 인덱스 스캔은 싱글블럭, 테이블 풀스캔은 멀티블럭
2. 순차 vs 랜덤
- 그냥 단순하게 순차적으로 읽는 방식이 시퀀셜입니다.
- 테이블 풀스캔, 인덱스레인지스캔 등이 시퀀셜이구요.
- 랜덤은 인덱스 스캔을 통해 테이블에 접근할 때의 방식입니다.
3. 메모리 vs 디스크
- 일단 메모리에 올라와 있으면 그걸 읽습니다.
- 메모리에 없으면 디스크에서 읽어서 메모리로 올린 뒤에 읽습니다.
- 즉, 메모리에 있냐 없냐에 따라 디스크로 접근할지 안할지가 결정되는 것 뿐입니다.