본문 바로가기
호구지책/DB

[DB] 데이터 베이스 튜닝

by 하늘의흐름 2016. 1. 31.
반응형

데이터 베이스 튜닝에 대한 강의를 들었다.


프로그래밍 작업 특히, 웹에서 쿼리를 사용할 경우

매우 유용한 팁을 많이 접할 수 있었다.


데이터 베이스의 메모리 아키텍쳐에서

튜닝의 대상은 부하가 걸리는 캐싱영역이 된다.


데이터 베이스의 튜닝은 크게 3가지 영역으로 나눈다.


1.DB Buffer Cache -> I/O 효율화

2.Library Cache -> SQL 파싱 부하 해소

3.작업요청 -> 데이터베이스 Call 최소화



1. I/O 효율화


1-1. 명시적 형변환 vs 묵시적 형변환

 여기서는 데이터 타입에 유의할 필요가 있다.

데이터 베이스는 자동으로 형변환을 진행하는데,(묵시적 형변환)

그럼으로 인해 처리에 부하가 발생하고, 쿼리속도도 늦어진다.

특히 숫자와 문자 타입이 불일치 하는 경우에 많이 발생한다.


1-2. 인덱스 스캔 vs 풀 스캔

 또한 인텍스 스캔과 풀 스캔에 대해서 알 필요가 있는데,

쿼리를 어떻게 짜느냐에 따라 전체를 읽어오기도 하고, 일부만

읽어오기도 한다. 상황에 맞게 짤 수 있어야 한다. 


 데이터가 작다면-예를 들어 보관주기가 일주일정도로 짧다면-

풀 스캔을 하는 것이 오히려 좋을 수 있지만, 데이터가 많다면

인덱스을 타는 것이 휠씬 효과적이다.


2. SQL 파싱 부하 해소


2-1. 하드 파싱 vs 소프트 파싱

 하드 파싱은 실행계획에 없는 쿼리를 최적화 과정을 거쳐서

실행계획에 추가하는 것으로 소프트 파싱보다 시간이 오래걸리고,

속도도 늦어 지기 때문에 붙은 이름이다.

 

 소프트 파싱은 별도의 실행계획이나 최적화 과정 없이

바로 처리가 되는 쿼리를 말한다. 추가적인 과정을 거치지 않아

처리 시간이 빠르고, 응답속도도 빠르므로, 튜닝을 한다면

소프트 파싱으로 처리가 되도록 변경해줘야 한다.


2-2.공유 커서

커서에는 크게 공유커서, 세션커서, 애플리케이션 커서가 있고,

우리가 일반적으로 접해서 알고 있는 커서는 애플리케이션 커서이다.


 공유 커서는 메모리 아키텍쳐에서 라이브러리 메모리 영역에 올라가 있어서 

다른 프로세스들도 접근해서 함께 사용이 가능하기 때문에 공유 커서라 불린다.


 세션 커서와 애플리케이션 커서는 프로세스에 종속적이므로 함께 사용할 수

없어 공유 커서와 성격이 다르다.


2-3.바인드 변수 사용

 예를들어 로그인 쿼리를 보자.

SELECT * user WHERE user_id = 'dd00oo' 

이와 같을 것이고 dd00oo에는 다른 아이디도 들어갈 수 있을 것이다.

SELECT * user WHERE user_id = 'dd00oo1' 

SELECT * user WHERE user_id = 'dd00oo2' 

SELECT * user WHERE user_id = 'dd00oo3'


이런식으로 말이다. 하지만 이것이 튜닝대상되는데, 데이터베이스에서는 

각 쿼리마다 다른 쿼리로 인식해서 새로운 실행계획을 만들기 때문이다.

즉 4*4 4번 실행계획을 만들어서 4번을 실행하여 16회 실행하게 된다.

(실행계획에 대한 이해가 중요하다는 뜻이 드러나는 부분이다.)


이러한 것들은 바인드 변수로 처리해주면


SELECT * user WHERE user_id = @user_id


한번의 실행계획을 만들어 4번 처리하게 되며

1+4 이런식으로 5회가 실행되게 된다.


이외에도 루틴을짜서 프로시저함수를 만들어 사용하는 방식,

애플리케이션 커서 캐싱등으로

최적화가 가능할 것이다. 


3.데이터베이스 Call 최소화


 3-1. User Call vs Recursive Call
작업요청위치에 따라 Call을 구분하면 2종류가 있으며, User Call은 네트워크를 공유하기
때문에 더 많은 비용이 발생한다.

 3-2.Parse Call -> Execute Call -> Fetch Call
 작업요청순서에 따라 Call을 구분하면, Parse Call(생성 요청),
Excute Call(실행 요청) -> Fetch Call(전송 요청)으로 나눠진다.

 3-3. Call 횟수를 줄인다.
 튜닝 관건은 Call 횟수를 줄이는 것이다. 바로 한 방에 SQL로 처리해주는 것.
Merge 문등을 사용해서 쿼리 횟수를 줄이면 튜닝이 가능하다.

 한방에 만들기는 어려운 경우가 있다. 그럴 때는 대안으로 array Processing을
사용할 수 있다.
 
 자바에서는 array Processing 관련 메서드를 제공하는데, addBatch()와 executeBatch()가
바로 그것이다.


참고

http://cyber.dbguide.net/


무료로 강의를 들을 수 있는 과정이 있다. 

SQL 전문가의 길이라고..

들어보면 좋을 것이다.

이 내용은 그 중 DB 성능 고도화 핵심원리의 내용을 정리한 것이다.


반응형

댓글