쿼리 파싱과 실행 계획 개요
쿼리 파싱 (Query Parsing)
쿼리 파싱은 SQL 쿼리를 데이터베이스가 이해할 수 있는 내부 표현으로 변환하는 과정입니다. SQL 쿼리가 데이터베이스에 도달하면, 데이터베이스는 쿼리를 다음과 같은 단계를 통해 처리합니다:
과정
- 문법 분석: SQL 쿼리의 문법이 맞는지 확인합니다. 예를 들어,
SELECT 문에서 FROM 뒤에 테이블 이름이 있어야 한다는 규칙을 확인하는 단계입니다.
- 어휘 분석: SQL 쿼리에서 각 단어(키워드, 테이블 이름, 컬럼 이름 등)를 인식하여 어떤 의미를 가지는지 파악합니다. 예를 들어,
SELECT * FROM users에서 SELECT는 데이터를 조회하겠다는 명령이고, users는 테이블 이름임을 인식합니다.
- 구문 트리 생성 (Syntax Tree): 쿼리가 올바른 SQL 문법을 따르는지 검사한 후, 이를 구문 트리(Syntax Tree) 또는 추상 구문 트리(Abstract Syntax Tree, AST)로 변환합니다. 이 트리는 SQL 문장의 구조를 표현한 트리 형태로, 데이터베이스가 SQL 쿼리를 분석하고 최적화할 수 있도록 돕습니다.
결과
- 파싱 단계에서 데이터베이스는 SQL 쿼리의 구문적 오류를 발견하고, 쿼리의 의미를 해석하여 내부 표현을 생성합니다. 이 내부 표현은 이후 최적화 및 실행 계획 수립에 사용됩니다.
실행 계획 (Execution Plan)
실행 계획은 SQL 쿼리를 실제로 어떻게 실행할지에 대한 세부 전략을 나타내는 데이터베이스의 분석 결과입니다. 이 단계에서는 쿼리를 실제로 실행하기 위한 전략을 선택합니다. 데이터베이스는 가능한 여러 가지 실행 방법을 평가하고, 최적의 방법을 선택하여 쿼리를 실행합니다.
과정
- 쿼리 최적화 (Query Optimization): 파싱된 SQL 쿼리는 다양한 실행 경로를 가질 수 있습니다. 예를 들어, 테이블을 검색할 때 인덱스를 사용할지, 전체 테이블을 스캔할지 결정해야 합니다. 쿼리 최적화기는 이를 평가하고 가장 빠른 실행 경로를 선택합니다. 쿼리 최적화기는 통상적으로 비용 기반 모델(Cost-based model)을 사용하여 최적화를 수행합니다.
- 실행 계획 수립: 최적화가 끝나면, 데이터베이스는 실행 계획(Execution Plan)을 생성합니다. 실행 계획은 어떤 테이블을 먼저 조회할지, 어떤 인덱스를 사용할지, 어떤 순서로 데이터를 결합할지 등과 같은 세부 사항을 포함합니다.
- 실행 계획 저장: 일부 데이터베이스 시스템에서는 실행 계획을 캐시하여 반복 실행 시 재사용할 수 있도록 합니다. PostgreSQL은 매번 쿼리를 실행할 때마다 실행 계획을 새로 생성합니다.
PostgreSQL 의 단점
쿼리 캐싱 부족
- PostgreSQL은 쿼리 파싱 후 실행 계획을 캐싱하지 않기 때문에, 동일한 쿼리가 반복적으로 실행되더라도 매번 새로 파싱을 거칩니다.
- 쿼리 파싱 및 실행 계획 생성이 빈번히 일어날 경우, 성능 저하가 발생할 수 있습니다.
- 특히 동적 SQL이나 파라미터화된 쿼리에서는 실행 계획이 매번 달라질 수 있기 때문에, 캐싱을 통한 성능 향상에 한계가 있을 수 있습니다.
TarzanDB Query Acceleration
TarzanDB는 External Caching 시스템 연계를 통해 Query 성능 극대화를 위한 Query Acceleration 기능을 제공하여 PostgreSQL의 빈번한 조회 Query 성능을 비약적으로 향상시킵니다.
핵심 기능
- PostgreSQL Engine은 Client가 접속할 때마다 Resource를 할당 받으며 Query가 처음 수행 될 때 전체 Query Plan을 확인하는 Hard-parsing을 수행하여 성능 저하의 원인으로 작용
- Connection Pool을 이용하면 Resource 재사용을 유도하여 Hard-parsing 방지
- TarzanDB는 External Cache 시스템을 이용해서 Caching 대상을 확대하여 조회 Query 성능 극대화