우리는 SQL을 단순히 실행하는데요. 내부에서는 여러 단계 프로세스를 거칩니다. SQL문을 데이터베이스 엔진이 이해하고 평가한 후 실행까지 하는 작은 작업들로 구성되어 있습니다. 이글에서 어떻게 SQL 구문 분석을 하는지 파싱과정을 상세하게 설명해 보도록 하겠습니다.
SQL 파싱 과정
우선 SQL을 하나하나 쪼개는 파싱 작업을 수행합니다. 쉽게 말해서 단어를 토큰화 한다고 볼 수도 있습니다. 그리고 나면 Optimiation 단계로 넘어가는데요. 이 단계는 아래 세 가지 과정을 거칩니다.
- Query transformer에서 사용자가 실행한 SQL을 그대로 최적화하는게 아니라 먼저 최적화하기 쉬운 형태로 변환을 합니다. 단 결과가 동일한 범위에서만 이 작업을 수행합니다.
- Plan Generator에서 하나의 쿼리를 수행하는데 있어, 후보군이 될만한 실행계획들을 생성합니다.
- Estimator에서 쿼리 오퍼레이션 각 단계를 정하고, 단계마다 카디널리티, 비용을 계산합니다. 최종적으로 실행계획 전체에 대한 총비용을 계산하게 됩니다. 실행계획이라는 말처럼 이는 어디까지나 예상 결과입니다.
이때 실행계획 평가를 위해 각 단계를 수행하는데 필요한 I/O, CPU, 메모리 사용량 등을 예측하는데요. 이 예측값은 데이터베이스 오브젝트 통계 정보와 하드웨어 시스템 성능 통계정보(CPU속도, Single Block/Multi Block read Time 등)를 이용해서 나온 결과입니다.
- 선택도 : 전체 데이터 중 조회 조건으로 입력된 값에 의해 선택되는 비율
- 카디널리티 : 특정 액세스 단계를 거치고 나서 출력될 것으로 예상되는 결과 건수(카디널리티 = 선택도*전체레코드수)
위의 과정을 거친 후 1개의 실행계획을 선택해서 SQL 엔진이 처리할 수 있는 언어로 generator합니다. Row-Source Generation이 Optimizer로부터 실행계획을 받아서 DB 내에서 재사용 가능한 쿼리 플랜을 생성하는 작업입니다. 마지막으로 쿼리 플랜대로 실행하는 단계가 Execution입니다.
소프트파싱 vs 하드 파싱
소프트파싱은 Shared Pool에 존재하는 SQL 실행계획을 공유하여 최적화 과정 생략하고 SQL수행하는 것을 말합니다. 이는 Library Cache에 SQL 존재한다는 이야기입니다. 반대로 하드파싱은 SQL이 캐싱돼 있지 않을때 최적화 과정을 통해 실행계획 생성하고 Row-Source 생성하는 과정을 수행합니다. 그림을 보시면 이해가 빠릅니다.
1.Sort Parsing
소프트 파싱은 Oracle이 이미 구문 분석된 SQL 문에 대해 기존 실행 계획을 재사용할 수 있을 때 발생합니다. 쿼리가 데이터베이스에 제출되면 Oracle은 먼저 Shared Pool 메모리 영역을 검사하여 SQL 문의 구문 분석된 표현(즉, 실행 계획)이 이미 있는지 확인합니다.
Oracle이 Shared Pool에서 일치하는 실행 계획을 찾으면 해당 계획을 재사용하여 SQL 문을 다시 분석하는 오버헤드를 피할 수 있습니다. 소프트 파싱은 새로운 실행 계획을 생성하는 단계를 건너뛰기 때문에 하드 파싱에 비해 더 빠르고 리소스를 절약할 수 있습니다.
소프트 파싱은 실행 계획을 반복적으로 구문 분석, 최적화 및 생성하는 데 따른 오버헤드를 줄여주기 때문에 자주 실행되는 SQL 문은 꼭 실행계획을 공유하게 해야 합니다.
2. Hard Parsing
하드 파싱은 Oracle이 기존 실행 계획을 재사용할 수 없고 SQL 문에 대한 새 계획을 생성해야 할 때 발생합니다. 이는 일반적으로 Shared Pool 일치하는 구문 분석된 SQL 문의 표현이 없거나 스키마 변경, 최적화 설정 또는 바인드 변수와 같은 다양한 이유로 인해 기존 계획을 재사용할 수 없는 경우에 해당됩니다.
SQL 문이 하드 파싱을 거치면 오라클은 구문 및 의미 분석, 최적화, 새로운 실행 계획 생성을 포함한 전체 구문 분석 프로세스를 수행합니다. 하드 구문 분석은 새로운 실행 계획을 생성하기 위한 추가 처리가 필요하기 때문에 소프트 구문 분석에 비해 리소스를 많이 사용하여 시간이 더 많이 소요됩니다.
하드 파싱은 오버헤드는 특히 SQL 문이 자주 실행되는 시스템에서 데이터베이스 성능에 악영향을 미칠 수 있습니다. 따라서 SQL 문을 최적화하고, 바인드 변수를 사용하고, 적절한 크기의 Shared Pool을 보장하여 하드 파싱을 최소화하면 전체 데이터베이스 성능을 향상할 수 있습니다.
마무리
요약하면, 소프트 파싱은 SQL 문에 대해 기존 실행 계획을 재사용하는 것을 의미하고, 하드 파싱은 기존 계획을 재사용할 수 없는 경우 새로운 실행 계획을 생성하는 것을 의미합니다. 하드 파싱을 최소화하고 소프트 파싱으로 변경하는 것이 데이터베이스 성능을 최적화하기 위한 중요한 전략입니다.
'데이터베이스' 카테고리의 다른 글
인덱스가 왜 필요했을까? (0) | 2024.05.13 |
---|---|
In-memory DB Redis의 특징, 어떻게 사용할까? (1) | 2024.04.26 |
SQL 다중처리(Array Processing) 원리 (0) | 2024.03.21 |
SQL의 LOOP-QUERY와 ONE-SQL 장단점 비교 (0) | 2024.03.19 |
인메모리(in-memory) db 유형에 따른 종류 (2) | 2024.03.15 |