[ SQL ] : Structured Query Language 구조적 질의문 이라하며
DBMS에서 사용자가 컴퓨터에게 DB적인 업무를 지시를 하기 위해 적는 언어

사용자가 SQL문을 던지면
Oracle은 SQL Parsing을 거친 후
해당 SQL이 Memory에 caching 되어 있는지를 확인
Memory에서 찾을 시 바로 실행하며, 못찾게 된다면
최적화(Optimization) 단계를 거치게 됩니다.
[Soft Parsing]
SQL Parsing 단계에서 SQL Cursor를 Memory에서
찾아 곧바로 실행단계(Execution)로 넘어가는 것
[Hard Parsing]
Memory에서 찾는데 실패해 최적화 단계(Optimization) 및
Row-Source 생성 단계를 거치는 것

맨 아래
Misses in library cache during parse 가 1이고,
Parse Call 한 횟수가 5,000번 이므로
5000번 수행하는 동안 첫 번째 시점에는 SQL Cursor를 찾지 못해 Hard Parsing을 했고,
나머지 4,999번은 Library Cache에 공유된 Cursor를 반복 재사용을 알 수 있습니다.
만약에 0번인 경우에는 이미 다른 Session에 의해 Memory에 생성된 SQL Cursor를 찾았다는 말
01. SQL 파싱
[ SQL Parser ] : 사용자가 던진 SQL을 가장 먼저 받아서 처리하는 엔진
[SQL Parser가 하는 일(과정)]
1) SQL 문장을 이루는 개별 구성요소를 분석하고 Parsing해서 Parsing Tree를 만든다.
=> SQL에 문법적 오류가 없는지, Syntax 체크가 이뤄진다.(select, from 등)
2) Parsing Tree가 만들어지고 나면 Semantic 체크를 통해 의미상 오류를 확인
=> SQL에 존재하지 않은 컬럼작성, 권한 없는 오브젝트 사용, 존재하지 않는것을 작성
3) Hashing 알고리즘을 이용해 해당 SQL Cursor가 Shared Pool에 Caching 되어 있는지를 확인
4) Shared Pool에서 찾은 SQL 문장이 현재 수행하려는 SQL문과 100% 일치하더라도 Parsing을 요청한
사용자가 다르거나 옵티마이저 관련 파라미터 설정이 다르면 새로운 SQL Cursor를 생성
여기까지가 SQL Parser가 하는 일이며 Memory에서 SQL Cursor를 못찾을 시
최적화를 수행하기위해 옵티마이저에게 넘어간다.

02. SQL 최적화
[ Optimizer ] : 시스템 통계 및 오브젝트 통계정보를 판단기준으로 삼아 다양한 액세스 경로를
비교하고 그 중 가장 효율적인 실행계획을 선택해주는 DBMS의 핵심 엔진
옵티마이저가 최적화를 수행할 때 세부적으로 아래 3개의 서브 엔진을 사용
[Query Transformer]
사용자가 던진 SQL을 그대로 둔 채 최적화하는게 아니라 우선 최적화하기 쉬운 형태로 변환을 시도
Query 변환 전후의 결과는 동일함을 보장
[Plan Generator]
하나의 Query를 수행하는 데 있어, 후보군이 될만한 실행계획들을 생성해 내는 역할을 한다.
[Estimator]
Query Operation 각 단계의 선택도, 카디널리티, 비용을 계산하고, 궁극적으로는
실행계획 전체에 대한 총 비용을 계산하며 이는 예상치 입니다.
03. Row-Source Generation
옵티마이저의 최적화 단계를 거치면 아래와 같이 SQL 처리과정을 표현한 실행계획이 만들어진다.

이것은 개념 수준의 실행계획이지 실제 실행 가능한 형태는 아니기에,
이것을 실행 가능한 코드 또는 Procedure 형태로 포맷팅하는 작업이 필요
이 역할을 Row-Source Generator가 담당
[ Row-Source ] : Record 집합을 반복 처리하면서 사용자가 요구한 최종 결과집합을
실제적으로 생성하는데 사용되는 제어 구조를 말함
※ 지금까지 과정을 보면 최적화를 수반한 Hard Parsing이 얼마나 '무거운'
작업인지를 설명하려하는 부분
Hard Parsing이 CPU를 많이 소비하는 몇 안되는 작업 중 하나
※ 이렇게 무거운 과정이기에 Hard Parsing 한 결과물(SQL 실행계획)을 한 번만 사용하고
버리지 않고 SQL Cursor를 재사용할 수 있도록 Memory에 Caching해 두며 이 Memory가
Library Cache 영역인 것이다.