데이터베이스 성능 튜닝에서

    • 라이브러리 캐시 최적화

    • 데이터베이스 Call 최소화

    • I/O 효율화 및 버퍼캐시 최적화

3가지를 3대 핵심요소라고 합니다.

이 중에서 I/O 효율화 원리부분입니다.


1. 블록단위 I/O

"모든 DBMS는 블록단위로 I/O 한다."

즉, 하나의 컬럼를 읽으려고 할 때도 레코드가 속한 블록 전체를 읽는다는 것이죠.

그렇기 때문에 아래의 SQL문의 일량이 같고 수행하는데에 성능이 동일하다고 볼 수 있는 것이지요.

 



그래서 액세스 블록수 액세스블록수가 성능에 가장 큰 영향을 미치는 성능지표가 되는 것이랍니다.

이러한 성능지표는 당연히 옵티마이저가 어떠한 방식으로 액세스할지 

(랜덤액세스를 할지, Full Table Scan을 할지) 결정할 때 쓰이게 됩니다.

 

"블록단위  I/O는 어떠한 시기에 적용되는 걸까"

블록단위 I/O의 적용시기는 다음과 같습니다.

    • 메모리 버퍼 캐시에서 블록을 읽고 쓸 때

    • 데이터파일에 직접 읽고 쓸 때 (Direct Path I/O)

    • 데이터파일에서 DB버퍼캐시로 블록을 적재할 때

    • 버퍼캐시에서 변경된 블록을 다시 데이터파일에 저장할 때

DBWR프로세스가 주기적으로 Dirty Buffer를 데이터파일에 한번에 여러블록씩 기록하는데, 

이것도 "버퍼캐시에서 변경된 블록을 다시 데이터파일에 저장할 때" 에 해당합니다.

Dirty Buffer : 사용자가 사용하여 내용이 변경되었지만 아직 디스크에 기록되지 않은 버퍼를 나타냅니다. 

- 출처 :http://www.gurubee.net/lecture/1887 (by. 김정식)





"오라클이 허용하는 블록의 크기는 어떻게될까"

오라클의 허용 크기는 2K, 4K, 8K, 32K 이며 데이터베이스 생성시 표준 블록크기 설정은 db_block_size의 값으로 설정이 가능합니다.

다른 블록의 크기를 동시에 사용하려면 각각 별도의 테이블 스페이스, 버퍼 Pool를 구성해야 해요.


"Sequential액세스 vs Random액세스"

데이터를 읽어드릴 때 방식으로, Sequential 액세스와 Random 액세스 두가지 방식이 있습니다.

먼저 Sequential액세스 는 레코드 간 논리적 또는 물리적인 

순서에 따라서 차례로 읽어드리는 방식입니다. (그림 6-2, ⑤)

인덱스 스캔시, 리프블록에 위치한 레코드의 포인터를 따라서 논리적 순서로 스캔하며 

테이블 스캔시, 물리적 저장 순서에 따라서 순서대로 읽습니다.

(인덱스를 B* Tree 방식이며 루트, 브랜치, 리프블록으로 구성됩니다.)

Sequential 액세스는 성능향상을 위해서 Multiblock I/O인덱스 Prefetch 같은 기능을 사용합니다.


반면 Random액세스를 한번 봐볼까요? 

이름에서 알 수 있듯이 레코드 간 논리적, 물리적 순서에 따르지 않고 읽는 방식입니다.  (그림 6-2, ①~④,⑥)

Sequential 액세스는 여러 건을 한번에 읽기위해서 한 블록에 액세스했다면 

Random 액세스는 한 건을 읽기위해 한 블록씩 접근합니다.(touch)

또한 성능향상을 위해 Pinning, 테이블 Prefetch 와 같은 기능을 사용합니다.

그렇다면 이 두가지 액세스를 어떻게 사용해야 효율적일까요?

해답은 선택도에 있습니다.액세스 효율은 선택도에 따라 결정됩니다.

(선택도 : 총 읽는 레코드에서 결과 집합으로 선택되는 비중)

즉, Sequential액세스선택도를 높이고 Random액세스발생량을 줄여 블록에 대한 반복 I/O를 줄이는 것이 액세스 효율을 높이는 방법이라고 할 수 있습니다.





 

 

'데이터베이스 > 오라클 성능 고도화' 카테고리의 다른 글

[성능고도화] 소개.  (0) 2017.08.31

+ Recent posts

"여기"를 클릭하면 광고 제거.