728x90
- 옵티마이저 힌트
- 운전자 자신만 아는 정보나 경험을 활용해 더 빨리 목적지에 도착할 수 있는 것처럼 통계정보에 담을 수 없는 데이터 또는 업무 특성을 활용해 개발자가 직접 더 효율적인 엑세스 경로를 찾아 낼 수 있다.
- 이럴 때 옵티마이저 힌트를 이용해 데이터 액세스 경로를 바꿀 수 있다.
- 힌트 사용법은 아래와 같다. 주석 기호에 '+'를 붙이면 된다.
SELECT /*+ INDEX(A 고객_PK) */
고객명, 연락처, 주소, 가입일시
FROM 고객 A
WHERE 고객ID = '00000000'
- 소프트 파싱 vs 하드파싱
- SQL 파싱, 최적화, 로우 소스 생성 과정을 거쳐 생성한 내부 프로시저를 반복 재사용할 수 있도록 캐싱해 두는 메모리 공간을 라이브러리 캐시(Library Cache)라고 한다.
- SQL을 캐시에서 찾아 곧바로 실행단계로 넘어가는 것을 '소프트 파싱(Soft Parshing)'이라 하고, 찾는 데 실패해 최적화 및 로우 소스 생성 단계까지 모두 거치는 것을 '하드 파싱(Hard Parshing)'이라고 한다.
- 옵티마이저가 사용하는 정보
- 테이블, 컬럼, 인덱스 구조에 관한 기본 정보
- 오브젝트 통계 : 테이블 통계, 인덱스 통계, (히스토그램을 포함한) 컬럼 통계
- 시스템 통계 : CPU 속도, Single Block I/O 속도, Multiblock I/O 속도 등
- 옵티마이저 관련 파라미터
- 하드파싱은 CPU를 많이 소비하는 몇 안 되는 작업 중 하나이다.
- 공유 가능 SQL
- DBMS에서 발생하는 부하는 대개 과도한 I/O가 원인이다.
- 그렇지 않음에도 불구하고 CPU 사용률은 급격히 올라가는 경우가 있는데 이는 동시다발적으로 발생하는 SQL 하드파싱이 원인일 때가 있다.
String SQLStmt = " SELECT * FROM CUSTOMER WHERE LOGIN_ID = '" + login_id + "'";
- 위와 같이 짰을 때 내부 프로시저를 하나씩 생성해서 라이브러리 캐시에 적재하게 된다
- 프로시저를 여러개 생성할 것이 아니라 프로시저 하나를 공유하면서 재사용하는 것이 마땅하다.
- 파라미터 Driven 방식으로 SQL을 작성하는 방법이 제공되는데 바인드 변수가 바로 그것이다.
String SQLStmt = " SELECT * FROM CUSTOMER WHERE LOGIN_ID = ? "
- 라이브러리 캐시를 조회하면 아래와 같이 SQL 하나만 발견된다
SELECT * FROM CUSTOMER WHERE LOGIN_ID = :1
- SQL 하드파싱은 최초 한 번만 일어나고 캐싱된 SQL을 여러 고객이 공유하며 재사용하게 된다.
출처 : 친절한 SQL 튜닝(저자: 조시형)
728x90
'Database > 친절한 SQL 튜닝' 카테고리의 다른 글
[친절한 SQL 튜닝 스터디] 4장 (0) | 2024.03.28 |
---|---|
[친절한 SQL 튜닝 스터디] 3장. 인덱스 튜닝 (0) | 2024.03.27 |
[친절한 SQL 튜닝 스터디] 2장. 인덱스 기본 (0) | 2024.03.27 |
[친절한 SQL 튜닝 스터디] 1장. SQL 처리 과정과 I/O - 데이터 저장 구조 및 I/O 메커니즘 (0) | 2024.03.27 |
[친절한 SQL 튜닝 스터디] 1장. SQL 처리 과정과 I/O - 실행계획 (2) | 2024.03.26 |