데이터 베이스 튜닝에 대한 강의를 들었다.
프로그래밍 작업 특히, 웹에서 쿼리를 사용할 경우
매우 유용한 팁을 많이 접할 수 있었다.
데이터 베이스의 메모리 아키텍쳐에서
튜닝의 대상은 부하가 걸리는 캐싱영역이 된다.
데이터 베이스의 튜닝은 크게 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 최소화
참고
http://cyber.dbguide.net/
무료로 강의를 들을 수 있는 과정이 있다.
SQL 전문가의 길이라고..
들어보면 좋을 것이다.
이 내용은 그 중 DB 성능 고도화 핵심원리의 내용을 정리한 것이다.
'호구지책 > DB' 카테고리의 다른 글
[DB/Oracle] 오라클 11g 설치 (0) | 2016.12.09 |
---|---|
[ODBC] 지정된 DSN은 드라이버와 응용 프로그램 간 아키텍처 불일치를 포함합니다. (0) | 2016.12.01 |
[DB/JDBC] 자바에서 DB 연결하기 (0) | 2016.04.19 |
[MySQL] 권한 부여 하기 (0) | 2016.03.08 |
[MySQL] MSSQL에서 MySQL로 저장 프로시저 마이그레이션 (0) | 2016.03.03 |
[DB] MS-SQL 에서 MySQL 로 마이그레이션 (0) | 2016.02.20 |
[MySQL] Storage Engine (0) | 2016.01.22 |
MSSQL 2005에서 데이터를 스크립트로 백업하기 (0) | 2015.08.17 |
댓글