SQL 처리 과정과 I/O

이영재·2022년 5월 28일
0

SQL

SQL은 구조적이고 집합적이고 선언적인 질의 언어이다.

  • SQL is designed for a specific purpose: to query data contained in a relational database.
  • SQL is a set-based, declarative query language, not an imperative langauage such as C or BASIC.

🤔 옵티마이저는 왜 필요한가?

원하는 결과집합을 구조적, 집합적으로 선언하지만, 그 결과집합을 만드는 과정은 절차적일 수 밖에 없다.
즉, 프로시저가 필요한데, 그런 프로시저를 만들어내는 DBMS 내부 엔진이 바로 SQL 옵티마이저다.

SQL 최적화

① SQL 파싱
사용자로부터 SQL을 전달받으면 가장 먼저 SQL 파서(Parser)가 파싱을 진행한다.

  • 파싱 트리 생성 : SQL 문을 이루는 개별 구성요소를 분석해서 파싱 트리 생성
  • Syntax 체크 : 문법적 오류가 없는지 확인. 예를 들어, 사용할 수 없는 키워드를 사용했거나 순서가 바르지 않거나 누락된 키워드가 있는지 확인
  • Semantic 체크 : 의미상 오류가 없는지 확인. 예를 들어, 존재하지 않는 테이블 또는 컬럼을 사용했는지, 사용한 오브젝트에 대한 권한이 있는지 확인

② SQL 최적화
SQL 옵티마이저는 미리 수집한 시스템 및 오브제트 통계정보를 바탕으로 다양한 실행경로를 생성해서 비교한 후 가장 효율적인 하나를 선택한다. 데이터베이스 성능을 결정하는 가장 핵심적인 엔진이다.

③ 로우 소스 생성
SQL 옵티마이저가 선택한 실행경로를 실제 실행 가능한 코드 또는 프로시저 형태로 포맷팅 하는 단계다. 로우 소스 생성기가 그 역할을 맡는다.

소프트 파싱 vs 하드파싱

SQL을 캐시에서 찾아 곧바로 실행 단계로 넘어가는 것을 '소프트 파싱(Soft Parsing)'이라 하고, 찾는데 실패해 최적화 및 로우 소스 생성 단계까지 모두 거치는 것을 '하드 파싱(Hard Parsing)'이라고 한다.
하드 파싱 작업의 결과를 효율적으로 관리하기 위해 라이브러리 캐시가 필요하다.
하드 파싱은 CPU를 많이 소비하는 작업 중 하나인데, 이러한 작업을 거쳐 생성한 내부 프로시저를 한번만 사용하고 버린다면 비효율적이기 때문이다.

  • 라이브러리 캐시(Library Cache) : SQL 파싱, 최적화, 로우 소스 생성 과정을 거쳐 생성한 내부 프로시저를 반복 재사용할 수 있도록 캐싱해 두는 메모리 공간 (SGA 구성요소 중 하나)
  • SGA(System Global Area)는 서버 프로세스와 백그라운드 프로세스가 공통으로 액세스하는 데이터와 제어 구조를 캐싱하는 메모리 공간

🤔 바인드 변수는 왜 필요한가?

바인드 변수를 통해 자주 사용하는 SQL의 하드 파싱을 최소화 할 수 있습니다.

SQL은 전체 SQL 텍스트 자체가 이름 역할을 하기 때문에 텍스트 중 작은 부분이라도 수정되면 그 순간 다른 객체가 새로 탄생하는 구조이다.




참고자료

  • [책] 친절한 SQL 튜닝 | 조시형
profile
왜why를 생각하는 두괄롬이 되자!

0개의 댓글