1.3.5 논리적I/O vs 물리적I/O

논리적 블록 I/O는 sql문을 처리하는 과정에서 메모리 버퍼캐시에서 발생한 총 블록 I/O

물리적 블록 I/O는 디스크에서 발생한 총 블록 I/O

메모리I/O는 전기적 신호인데 반해, 디스크I/O는 액세스 암(arm)을 통해 물리적 작용이 일어나므로 메모리 I/O에 비해 상당히 느림 (보통 10,000)배 느리며, 디스크 경합이 심할 때는 더 느리다.

 

버퍼캐시 히트율 : 버퍼캐시 효율을 측정하는데 전통적으로 가장 많이 사용해 온 지표

BCHR = ( 캐시에서 곧바로 찾은 블록수 / 총 읽은 블록 수 ) x 100

           = ( ( 논리적 I/O - 물리적 I/O ) / 논리적 I/O ) x 100

           = ( 1 - ( 물리적 I/O ) / ( 논리적 I/O ) ) x 100

 

tip. BCHR은 읽은 전체 블록 중에서물리적인 디스크I/O를 수반하지 않고 곧바로 메모리에서 찾은 비율을 나타낸다고 볼수있다고한다.

* 실제 SQL 성능을 향상하려면 물리적I/O가 아닌 논리적I/O를 줄여한다는 사실을 알수있음.

 - 논리적 I/O를 줄이는 방법으로는 SQL을 튜닝해서 읽는 총 블록 개수를줄이면 됨. (당연한 이야기...)

 

1.3.6 Single Block I/O vs Multi Block I/O

 메모리 캐시가 클수록 좋지만, 데이터를 모두 캐시에 적재할수는 없다. ( 비용적한계, 기술적한계 때문에..) 그리하여 일부만 캐시에 적재해서 읽을수 있는데.

한번에 한 블록씩 요청해서 메모리에 적재하는 방식이 'Single block I/O' 이며, 한 번에 여러 블록씩 요청해서 메모리에 적재하는 방식을 'Multi block I/O'라고 한다.

 - 인덱스를 이용 할때는 기본적으로 인덱스와 테이블 블록 모두 Single block I/O 방식을 사용한다.

 - 반대로, 많은 데이터 블록을 읽을 때는 Multiblock I/O 방식이 효율적이며, 인덱스를 이용하지않고 테이블 전체 스캔을 할때 사용한다.

 

1.3.7 Table Full Scan vs Index Range Scan

테이블 전체를 스캔해서 읽는방식, 인덱스를 이용해서 읽는 방식 2가지로 테이블에 저장된 데이터를 읽는방식이 존재한다.

( 많은 개발자의 인식과 달리 인덱스가 sql 성능을 떨어뜨리는 경우도 상당히 많다는 점도 알아야한다고 함 ex.집계용 sql과 배치 프로그램)

 

1.3.8 캐시 탐색 메커니즘

Direct Path I/O를 제외한 모든 블록 I/O는 메모리 버퍼캐시를 경유한다. 아래 오퍼레이션은 모두 버퍼캐시 탐색과정을 거친다.

- 인덱스 루트 블록 읽을때

- 인덱스 루트 블록에서 얻은 주소 정보로 브랜치 블록을 읽을 때

- 인덱스 브랜치 블록에서 얻은 주소 정보로 리프 블록을 읽을때

- 인덱스 리프 블록에서 얻은 주소 정보로 테이블 블록을 읽을때

- 테이블 블록을 Full Scan 할때

 

공유캐시의 특정 자원을 두 개 이상 프로세스가 같이 사용할수없다, 같이 사용하는것 처럼 보이지만, 특정 순간에는 한 프로세스만 사용 할수있다. 그 순간 다른 프로세스는 줄 서서 기다려야 한다. 이런 줄서기가 가능하도록 지원하는 메커니즘이 래치(Latch)다.

위 설명을 이해하기 위해 서적에서는 카쉐어링 서비스로 예를 들었다( ex. 쏘카, 그린카) 

 

추가개념_

버퍼 Lock :  버퍼블록의 자체에 대한 직렬화 문제를 해결

+ Recent posts