플스큐엘 컴파일링으로 성능 혁신
초록
플스큐엘 함수의 실행 비용은 SQL‑PL/SQL 간의 컨텍스트 전환에서 비롯된다. 본 논문은 PL/SQL 함수를 정적 단일 할당(SSA) 형태로 변환하고, 이를 재귀적 공통 테이블 표현식(CTE)으로 컴파일함으로써 모든 PL/SQL 로직을 순수 SQL 서브쿼리로 대체한다. 실험 결과, 주요 RDBMS에서 평균 30%‑70% 이상의 실행 시간 감소를 확인했으며, SQLite와 같은 PL/SQL 미지원 엔진에서도 동일한 로직을 실행할 수 있게 된다.
상세 분석
이 논문은 PL/SQL(또는 PL/pgSQL, T‑SQL 등) 함수가 데이터베이스 엔진 내부에서 인터프리터 모드와 옵티마이저 모드 사이를 빈번히 오가며 발생하는 컨텍스트 스위치 비용을 근본적으로 제거하는 방법을 제시한다. 핵심 아이디어는 함수 본문을 정적 단일 할당(SSA) 형태로 변환한 뒤, SSA의 φ‑함수를 이용해 변수 버전을 명시하고, 모든 제어 흐름(LOOP, WHILE, FOR 등)을 goto 기반의 기본 블록으로 환원한다. 이후 SSA를 함수형 관리형 정규형(ANF)으로 변환하면서 각 라벨을 별도 함수로 매핑하고, goto를 함수 호출로 바꾸어 반복 구조를 꼬리 재귀 형태로 만든다.
재귀 형태는 다시 하나의 사용자 정의 함수(UDF)로 평탄화(defunctionalization)하고, 최종적으로는 WITH RECURSIVE 구문을 이용한 재귀 CTE로 감싼다. 이렇게 생성된 SQL 쿼리는 원래 PL/SQL 함수 호출 지점에 인라인될 수 있어, 전체 실행 계획이 하나의 연산 그래프에 포함된다. 따라서 플랜 생성·캐시·인스턴스화 비용이 한 번만 발생하고, 반복 실행 시에도 동일 플랜을 재사용한다.
실험에서는 PostgreSQL, SQL Server, Oracle 등 주요 상용 RDBMS와 SQLite를 대상으로 벤치마크를 수행했다. 특히 복잡한 로봇 경로 시뮬레이션 함수인 walk를 예제로 사용했으며, 원본 PL/pgSQL 구현에서 Q_i 쿼리 호출에 소요되는 시간 비중이 50% 이상이었음에도 불구하고, 컴파일된 재귀 CTE 버전에서는 전체 실행 시간이 35%~70% 감소했다. 이는 컨텍스트 스위치 비용이 크게 감소했기 때문이다. 또한, SQLite와 같이 PL/SQL을 전혀 지원하지 않는 엔진에서도 동일한 로직을 실행할 수 있게 되어, 데이터베이스 이식성 측면에서도 큰 장점을 제공한다.
논문은 또한 컴파일 과정에서 적용 가능한 최적화 기법들을 제시한다. 예를 들어, SSA 단계에서 상수 전파와 불필요한 변수 제거, ANF 단계에서 불필요한 중간 let 바인딩 축소, UDF 단계에서 재귀 호출의 꼬리 최적화 등을 통해 생성된 SQL의 복잡도를 낮출 수 있다. 이러한 최적화는 기존 DBMS의 쿼리 옵티마이저가 더 효율적인 플랜을 선택하도록 돕는다.
전체적으로 이 연구는 “PL/SQL을 완전히 컴파일해 SQL로 치환한다”는 급진적 접근이 실제 시스템에서 실현 가능함을 증명하고, 기존에 PL/SQL 사용을 회피하라는 개발자 관념을 재검토하도록 만든다. 향후 연구에서는 자동화된 컴파일러 구현, 더 복잡한 데이터 구조(예: 컬렉션, 레코드 타입) 지원, 그리고 분산 데이터베이스 환경에서의 적용 가능성 등을 탐색할 여지가 있다.
댓글 및 학술 토론
Loading comments...
의견 남기기