SQL은 구조적이고 집합적이고 선언적인 질의 언어이다.
🤔 옵티마이저는 왜 필요한가?
원하는 결과집합을 구조적, 집합적으로 선언하지만, 그 결과집합을 만드는 과정은 절차적일 수 밖에 없다.
즉, 프로시저가 필요한데, 그런 프로시저를 만들어내는 DBMS 내부 엔진이 바로 SQL 옵티마이저다.
① SQL 파싱
사용자로부터 SQL을 전달받으면 가장 먼저 SQL 파서(Parser)가 파싱을 진행한다.
② SQL 최적화
SQL 옵티마이저는 미리 수집한 시스템 및 오브제트 통계정보를 바탕으로 다양한 실행경로를 생성해서 비교한 후 가장 효율적인 하나를 선택한다. 데이터베이스 성능을 결정하는 가장 핵심적인 엔진이다.
③ 로우 소스 생성
SQL 옵티마이저가 선택한 실행경로를 실제 실행 가능한 코드 또는 프로시저 형태로 포맷팅 하는 단계다. 로우 소스 생성기가 그 역할을 맡는다.
SQL을 캐시에서 찾아 곧바로 실행 단계로 넘어가는 것을 '소프트 파싱(Soft Parsing)'이라 하고, 찾는데 실패해 최적화 및 로우 소스 생성 단계까지 모두 거치는 것을 '하드 파싱(Hard Parsing)'이라고 한다.
하드 파싱 작업의 결과를 효율적으로 관리하기 위해 라이브러리 캐시가 필요하다.
하드 파싱은 CPU를 많이 소비하는 작업 중 하나인데, 이러한 작업을 거쳐 생성한 내부 프로시저를 한번만 사용하고 버린다면 비효율적이기 때문이다.
🤔 바인드 변수는 왜 필요한가?
바인드 변수를 통해 자주 사용하는 SQL의 하드 파싱을 최소화 할 수 있습니다.
SQL은 전체 SQL 텍스트 자체가 이름 역할을 하기 때문에 텍스트 중 작은 부분이라도 수정되면 그 순간 다른 객체가 새로 탄생하는 구조이다.