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 |
댓글