SQL 파싱과 최적화

운구름·2022년 5월 1일
0
post-thumbnail

SQL 최적화란 무엇인가

SQL 이란?

  • SQL은 Structured Query Language 라고 구조적 질의 언어.
  • 구조적이고 집합적이고 선언적인 질의 언어

쿼리를 실행하면서 원하는 결과를 만들때, 절차를 만들고 그 절차대로 결과를 만든다.
여기서 특정한 업무를 수행하기 위한 절차를 '프로시저'라 한다.

쿼리를 실행할 때, 그 프로시저를 만들어내는 DBMS 내부 엔진이 'SQL 옵티마이저' 이다.

SQL이라는 질의 언어를 옵티마이저에게 던져주면 그 옵티마이저가 프로그래밍을 대신 해준다고 보면다. DBMS 내부에서 옵티마이저가 프로시저를 작성하고 컴파일 후 실행항 가능한 상태로 만드는 모든 과정을 'SQL 최적화'라고 한다.

SQL 최적화 과정

  1. SQL 파싱
  2. SQL 최적화
  3. 로우 소스 생성

1. SQL 파싱

쿼리를 받으면 SQL 파서가 파싱을 진행.

  1. 파싱트리 생성 : SQL문을 이루는 개별 구성요소 분석후 파싱 트리 생성
  2. syntax 체크 : 문법 오류가 있는지 확인
  3. semantic 체크 : 의미상 오류가 없는지 확인

2. SQL 최적화

옵티마이저가 미리 수집한 시스템, 오브젝트 통계 정보를 최적의 실행계획을 선택한다.

3. 로우 소스 생성

옵티마이저가 선택한 실행계획을 프로시저로 포멧팅 하는 단계.
그 역할을 로우 소스 생성기(Row- Source Generator)가 한다.

옵티마이저

사용자가 원하는 작업의 가장 효율적인 길을 선택해주는 엔진이다.

옵티마이저의 최적화 단계

  1. 사용자의 쿼리 수행에 사용될 실행계획 후보군을 선정
  2. 데이터 딕셔너리에 수집해둔 시스템, 오브젝트 통계 정보를 이용해 실행계획들의 예산비용 산정
  3. 최저 비용 실행 계획 선택

실행계획 (Execution Plan)

DBMS에서 실행계획을 확인하면 옵티마이저가 생성한 처리절차를 확인할 수 있다.
옵티마이저는 실행계획을 비용을 기준으로 선택한다.

'비용(Cost)'은 쿼리를 수행하는동안 발생하는 I/O 횟수 및 예상 소요시간이다. (또는 CPU 점유율로 나타나기도 함.)

옵티마이저 힌트

개발자가 직접 데이터 엑세스 경로를 변경할 수 있다.
그 경로는 '옵티마이저 힌트' 를 이용해서 변경할 수 있다.

데이터 엑세스 경로는 Index scan, Full scan 등 말 그대로 데이터 엑세스 하는 방법

아래와 같이 쿼리문에 주석 기호에 +를 붙이면 된다.

SELECT /*+ INDEX (A 고객_PK) */
	고객명, 연락처, 주소, 가입일시
FROM 고객 A
WHERE 고객ID = '0000000008'

주의사항

  • FROM에 ALIAS를 지정하면 힌트에도 ALIAS 꼭 사용.
  • 테이블 지정시 스키마명 명시❌
  • 힌트 나열할때 , 사용하면 안됨
/*+ INDEX(A A_X01) INDEX(B, B_X03) */ -> 유효 (힌트 인자는 , 사용가능)
/*+ INDEX(A A_X01), INDEX(B B_X03) */ -> 첫번째 인자만 유효.
/*+ FULL(SCOTT.EMP) */ -> 스키마명 사용하면 안됨. (무효)
SELECT /*+ FULL(EMP) */ FROM EMP E -> ALIAS 사용해야 함. (무효)

-- 주석은 실수의 위험이 있어서 선호하지 않음.

옵티마이저 힌트는 언제 사용하는가

애플리케이션 환경에 따라 최적의 방식이 달라질수 있다. 만약 옵티마이저의 실수에 큰 피해가 생기는 시스템이라면 빈틈없이 옵티마이저 힌트를 기술하는 것이 좋다.

profile
뭉실뭉실 코더 운구름

0개의 댓글