본문 바로가기
SQL 튜닝

SQL파싱과 최적화

by proudev 2024. 4. 12.

SQL(structed Query Language)

- SQL은 기본적으로 구조적(structed)이고, 집합적(set-based)이고 선언적(declaration) 질의 언어이다.

- 사용자는 SQL를 만들면 옵티마이저가 해당 SQL에 맞는 최적의 코스를 분석한 다음 프로시저에게 제일 효과적인 실행계획을 준다.

최적화 과정 간단히

 

 

* SQL 최적화 과정 알아보기

1) SQL 파싱

- SQL 최적화하는 과정을 구체적으로 말하자면, 크게 SQL 작성-> SQL 파싱 -> SQL 최적화입니다.

- SQL를 주면 DB에서 해당 SQL을 파싱 트리로 생성한다. 여기서 문법적인(Syntax) 오류를 체크하고, 의미상(Sematic) 오류는 체크를 한다.

- 여기서의 의미상 오류는 존재하지 않는 테이블 또는 칼럼, 오브젝트에 대한 권한이 있는지

 

2) SQL 최적화

- 옵티마이저는 시스템 정보와 오브젝트의 정보를 파악해서 최적의 경로(cost)를 불러준다.

- 여기서 말하는 시스템 정보(DB이외의 자원)에서 CPU 속도, 네트워크 대역폭, 메모리 용량

 

 

옵티마이저는 네이게이션이라고 생각할 수 있는데, 네비게이션은 항상 최적의 경로를 제공해주는 것은 아니다.

즉, 네비게이션 조차도 예상한 분석을 토대로 하기에 틀릴 수가 있다. 이에 오히려 해당 도메인과 데이터에 대한 이해가 많은 개발자가 더 정확한 경로를 알 수 있는데, 이 정확한 경로를 사욯하기 위해 옵티마이저에게 힌트를 줄 수 있다.

 

그럼 힌트를 사용하는 방법에 대해서 아래와 같이 설명드리면 

1) /*+  full(EMP) */ 이와 같이 주석 사이에 "+"라는 기회가 들어간다.

select /*+ INDEX(A 직원_PK) */  
   직원 이름, 연락처
from 직원 A

 

 

2) 아래와 같이 --+ 줄바꿈 오류 발생

sql = " select --+ INDEX(A 직원_PK)" 아래쪽 모두 주석됨.
	+ "     직원명,순번" 
    + " from 직원 A";

 

 

3) 데이터 지정할떄 스키마명 지정하면 안됨.

select /*+full(PETER.EMP) */
from EMP

 

4) from절 옆에 별칭으로 해당 테이블을 지정했으면, 힌트를 줄때는 테이블명이 아닌 별칭명으로 주어야 한다.

select /*+full(PETER.EMP) */
from EMP P

 

 

힌트를 통해서 옵티마이저에게 자신이 원하는 방향으로 진행할 수 있는데, 이를 위해 힌트를 사용한다.

관여의 범위가 큰 힌트 

 장점: 디테일하게 접근 가능함

SELECT /*+ FULL(emp) INDEX(emp emp_index) PARALLEL(emp, 4) */
       employee_id, employee_name
FROM employees emp
WHERE department_id = 10;

 

사용자가 관여한 범위가 작을 수로

 장점: 간편함

SELECT /*+ INDEX(employee emp_index) */
       employee_id,
       employee_name
FROM employees
WHERE department_id = 10
--+AND salary > 5000;

'SQL 튜닝' 카테고리의 다른 글

데이터 저장 구조 및 I/O 메커니즘  (0) 2024.04.23
SQL 공유 및 재사용  (0) 2024.04.13

댓글