DB I/O 및 인덱스 관련하여 몇가지 여쭙고자 합니다. 0 1 1,549

by 예리한 [DB 기타] DB I/O 인덱스 [2015.01.16 10:08:26]


오라클에서 쿼리 수행시 먼저 버퍼캐시(메모리)에서 해당 데이터가 존재하는지 확인하고
없을 경우엔 디스크 i/o를 수행하는것으로 알고 있는데요.

1) 여기서 쿼리를 통해 매칭되는 결과 중 일부만이 버퍼캐시에 존재할 경우 
   해당 데이터는 버퍼캐시에서 읽어드리고 없는 데이터는 디스크에서 읽는것인건가요?
2) 오라클 DBMS의 SGA영역 크기와 또는 그 내부에 버퍼캐시 크기만도 조정이 가능한 것인가요?
   (* 만약 어떤 db총 데이터 용량이 5g라고하고, 해당 db서버 메모리용량이 10g가 인경우 
         버퍼캐시에 모든 데이터를 담을 수 있는지 궁금합니다.)
3) 여기서 db i/o를 메모리(캐시) -> 디스크 순으로 하는것은 대부분의 메이저 dbms라면 동일한 방식이라고 봐도 될까요?

그 다음엔 인덱스와 겹쳐서 의문점이 드는것이

4) 실제 데이터보다 인덱스 데이터가 버퍼캐시에 우선적으로 적재되나요?
5) 만약 그렇다면 버퍼캐시에서 인덱스 값을 우선적으로 검색한 후 해당 값으로 디스크에 있는 실데이터를 i/o하는 방식이라고 보면 될까요?

마지막으로 인덱스의 실제 값이 궁금합니다.
6) 인덱스의 값을 실제 해당 데이터의 위치값을 저장해야 바로 찾아갈 수 있을텐데
   그럼 여기서 인덱스의 값은 디스크의 LBA값이 되는건가요?
7) 만약 인덱스의 값에 실제데이터의 디스크 LBA값이 저장되는 것이라면
   실데이터가 모두 버퍼캐시에 위치해 있는 경우라면 인덱스스캔이 아니라 테이블스캔이 되는건지 궁금합니다;;

초보자라 모르는게 많은데 해당 부분들은 검색을 통해서 찾아지지가 않아 해결이 안되네요
답변을 구하고자 질문글을 올렸습니다.
감사합니다 ^^;

by DJ [2015.01.16 12:56:15]

간단하게 설명드리면 Index 이든 Table이든 디스크에 없으면 메모리에 올려 놓고 메모리에 있으면 바로 갔다쓰는거고요. Oracle경우 Block 단위로 처리된다는 것만 염두에 두시면 될것 같구요.

결국 성능 측면에서 보면 최소한의 Block을 처리하는게 좋겠죠. (Index이든 Table이든)

그리고 Data 버퍼 캐시만 조정 가능합니다.

6,7번은 B*Tree Index 가 어떻게 구성되는지 확인해 보시면 이해하는 데 도움이 되실듯 합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입