Database/친절한 SQL 튜닝

[친절한 SQL 튜닝 스터디] 1장. SQL 처리 과정과 I/O - 소프트 파싱, 하드파싱

쿠카이든 2024. 3. 26. 22:15
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을 여러 고객이 공유하며 재사용하게 된다.
728x90

출처 : 친절한 SQL 튜닝(저자: 조시형)

728x90