. 데이터베이스 연결(Connection)
– 연결 요청에 대한 부하는 쓰레드(Thread) 기반 아키텍처 보다 프로세스 기반 아키텍처에서 더 심하게 발생한다.
– 전용 서버(Dedicated Server) 방식으로 오라클 데이터베이스에 접속하면 사용자가 데이터베이스 서버에 연결 요청을 할 때마다 서버 프로세스(또는 쓰레드)가 생성된다.
– 공유 서버(Shared Server) 방식으로 오라클 데이터베이스에 접속하면 사용자가 데이터베이스 서버에 연결 요청을 할 때마다 서버 프로세스(또는 쓰레드)가 생성된다.
. 데이터베이스 저장 구조
– 데이터를 읽고 쓰는 단위는 블록(=페이지)이다.
– 데이터파일에 공간을 할당하는 단위는 익스텐트다.
– SQL Server에서는 한 익스텐트에 속한 페이지들을 여러 오브젝트가 나누어 사용할 수 있다.
. 메모리 구조
– DB 버퍼 캐시는 데이터 파일로부터 읽어 들인 데이터 블록을 담는 캐시 영역이다.
– /*+ append */ 힌트를 사용하면 Insert 시 DB 버퍼 캐시를 거치지 않고 디스크에서 직접 쓴다.
– 클러스터링 팩터가 좋은 인덱스를 사용하면 Buffer Pinning 효과로 I/O를 줄일 수 있다.
. Response Time Analysis 성능관리
– Response Time = CPU Time + Queue Time
. SQL 작성 방식
– Static SQL, String형 변수에 담지 않고 코드 사이에 직접 기술한 SQL문을 말한다.
– Dynamic SQL, String형 변수에 ㄷ마아서 실행하는 SQL문을 말한다.
– Static SQL을 지원하는 개발환경에선 가급적 Static SQL로 작성하는 것이 바람직하다.
. 데이터베이스 Call
– SELECT 문장에선 대부분 I/O가 Fetch Call 단계에서 일어난다.
– INSERT, UPDATE, DELETE 문장에선 Fetch Call이 전혀 발생하지 않는다.
. 부분범위처리
– 부분범위처리가 가능하도록 SQL을 작성하면 출력 대상 레코드가 많을수록 쿼리 응답 속도도 그만큼 빨라진다.
– Array 크기를 증가시키면 데이터베이스 Call 횟수가 감소한다.
– Array 크기를 증가시키면 블록 I/O 횟수가 감소한다.
. 사용자 정의 함수(User Defined Function)
– SQL을 포함하는 형태의 사용자 정의 함수라면, 대용량 쿼리에 그것을 사용하는 순간 성능이 크게 저하된다.
– 성능이 중요하다면, 함수 안에서 또다른 함수를 Recursive하게 호출하는 형태는 지양해야 한다.
. 오라클, DB 저장형 함수(사용자 정의 함수) 사용시, 성능 저하 원인
– 가상머신(VM) 상에서 실행되므로 매번 바이트 코드를 해석하는 부하
– 쿼리 문장의 조회 건수만큼 함수를 반복적으로 호출하는 부하
– 함수에 내장된 쿼리가 있다면, 해당 문장을 Recursive하게 반복 수행 하는 부하
. I/O 효율화 튜닝 방안
– 필요한 최소 블록만 읽도록 쿼리를 작성한다.
– 전략적인 인덱스 구성은 물론 DBMS가 제공하는 다양한 기능을 활용한다.
– 필요하다면, 옵티마이저 힌트를 사용해 최적의 액세스 경로로 유도한다.
. 블록 I/O
– Random I/O는 인덱스를 통해 테이블을 액세스할 때 주로 발생한다.
– Single Block I/O는 인덱스를 통해 테이블을 액세스할 때 주로 발생한다.
– Multiblock I/O는 인덱스를 이용하지 않고 테이블 전체를 스캔할 때 주로 발생한다.
. 데이터베이스 I/O 원리
– 한 쿼리 내에서 같은 블록을 반복적으로 액세스하면 버퍼 캐시 히트율(BCHR)은 높아진다.
– I/O를 수행할 때 익스텐트 내에 인접한 블록을 같이 읽어들이는 것을 Multiblock I/O라고 한다.
– MPP(Massively Parallel Processing) 방식의 데이터베이스 제품에선 각 프로세스가 독립적인 메모리 공간을 사용하며, 데이터를 저장할 때도 각각의 디스크를 사용한다. 읽을 때도 동시에 각각의 디스크를 액세스하기 때문에 병렬 I/O 효과가 극대화 된다.