"SELECT * FROM CUSTOMER WHERE LOGIN_ID ='" + login_id+ "'";
DB버퍼캐시 : 데이터 캐시!, 디스크에서 읽은 데이터블록을 캐싱해둠으로 같은 블록에대한 I/O CALL을 줄이는데 목적
공유메모리 영역이라 같은 블록을 읽는 다른 프로세스도 득을본다.
논리적 I/O 메모리 버퍼캐시에서발생한 총 블록 I/O
물리적 I/O : 디스크에서 발생한 총 블록 I/O
SQL처리 도중 읽어야 할 블록을 버퍼캐시에서 찾지 못할때만 디스크를 액세스하므로, 논리적 블록 I/O중 일부를 물리적으로 I/O한다.
메모리 I/O는 전기신호인데 반해, 디스크 I/O는 액세스암을 통해 물리적 작용이 일어나므로 메모리I/O에 비해 상당히 느림. 보통 10000배느림. 디스크경합이 심하면 더느림
SQL을 수행하면서 읽은 총 블록I/O가 논리적 I/O
DIRECT PATH READ방식을 제외하면 모든 블록은 DB버퍼캐시를 경유해서 읽는다.
따라서 논리적I/O횟수는 DB버퍼캐시에서 블록을 읽은 횟수와 일치
버퍼캐시 히트율
BCHR = (캐시에서 곧바로 찾은 블록 수 / 총 읽은 블록 수) 100
= ( ( 논리적 I/O - 물리적 I/O ) / 논리적I/O ) 100
= ( 1 - (물리적 I/O ) / (논리적 I/O)) * 100
공식에서 보이듯이 전체 블록중에서 물리적 디스크 I/O를 수반하지않고 곧바로 메모리에서 찾은 비율
온라인트랜잭션을 주로 처리하는 애플리케이션이라면, 시스템 레벨에서 평균 99% 히트율을 달성해야한다.
물리적 I/O가 성능을 결정하지만, 실제 SQL성능을 향상하려면 물리적 I/O가 아닌 논리적 I/O를 줄여야 한다.
논리적 I/O가줄면 물리적I/O도 감소하니까 결국 성능도 향상된다.
버퍼캐시 탐색과정을 거치는 명령
DBMS는 버퍼캐시를 해시구조로 관리
해시구조 특징
메모리 공유자원에 대한 엑세스 직렬화
해시 체인 레치 : 자물쇠를 열수있는 키를 획득한 프로세스만이 체인으로 진입가능
버퍼 lock : 버퍼블록 자체 직렬화 매커니즘
이런 직렬화 메커니즘에 의한 캐시 경합을 줄이려면, SQL튜닝을 통해 쿼리일량(논리적 I/O) 자체를 줄여야 한다.
물리적I/O횟수를 줄이자! 물리적 I/O를 줄이려면 논리적I/O를줄이도록 SQL을 튜닝하자!!!
논리적 I/O를 줄이면 DISK I/O뿐아니라 직렬화에의한 캐시 경합을 줄여서 속도향상을할수있다
I/O횟수를 줄이는것이 SQL튜닝의 핵심이다!!!!
무조건 인덱스스캔이 좋은것은아니다!!!!!! 데이터양에따라 풀스캔(MULTIBLOCK I/O)가 좋을수도있다
CARDINALITY를 보고 잘판단해서 결정해야한다!!!!!!!!!!!!!!!!!