SQLite 백엔드 내부: 가상 머신, 스토리지, 그리고 빌드 프로세스
Source: Dev.to
Virtual Machine (VDBE)
프론트엔드가 컴파일을 마치면 바이트코드 프로그램을 Virtual Database Engine (VDBE)에게 전달합니다.
바이트코드 프로그램은:
- 명령어가 순차적으로 나열된 선형 시퀀스
- 각 명령어는 opcode와 최대 다섯 개의 피연산자를 가짐
- 한 번에 하나의 명령어씩 순차적으로 실행
VM은 데이터베이스 작업(테이블 스캔, 값 비교, 커서 관리, 트랜잭션 의미 보장 등)을 위해 특별히 설계된 맞춤형 CPU처럼 동작합니다.
Tree Module (B‑tree Storage)
SQLite는 트리 구조를 이용해 데이터를 저장합니다:
- Tables → B+ 트리
- Indexes → B‑트리
각 테이블과 인덱스는 독립적인 트리 구조를 가집니다. 구현 파일은 다음과 같습니다:
btree.c– 트리 로직btree.h– 공개 인터페이스
트리 모듈은 검색, 삽입, 삭제, 업데이트 및 구조적 변경(예: 테이블·인덱스 생성·삭제)을 지원합니다.
Pager
페이저는 모든 파일 I/O를 중재하는 핵심 구성 요소입니다. 트리 모듈은 데이터베이스 파일에 직접 접근하지 않고, 페이저가 제공하는 고정 크기 페이지를 사용합니다.
페이저의 주요 역할:
- 데이터베이스 페이지 읽기·쓰기
- 메모리 내 페이지 캐시 유지
- 파일 잠금 처리
- 롤백 저널 관리
- 트랜잭션 경계 강제
실질적으로 페이저는 데이터 관리자, 잠금 관리자, 로그 관리자, 트랜잭션 관리자 역할을 수행합니다. 소스 파일은:
pager.cpager.h
페이저 덕분에 SQLite는 단일 데이터베이스 파일만으로 ACID 보장을 제공할 수 있습니다.
lovestaco@i3nux-mint:~/pers/sqlite$ ll /home/lovestaco/pers/sqlite/bld/sqlite3
-rwxrwxr-x 1 lovestaco lovestaco 6.9M Jan 11 17:14 /home/lovestaco/pers/sqlite/bld/sqlite3
Build Process
SQLite의 빌드 과정은 자체 포함성과 재현성을 중시하는 철학을 반영합니다. 총 여섯 단계로 구성됩니다:
sqlite3.h생성- SQL 파서 빌드
- VM opcode 생성
- opcode 이름 생성
- SQL 키워드 테이블 생성
- 라이브러리 컴파일
빌드 중:
lemon.c가parse.c와parse.h를 생성mkkeywordhash.c가keywordhash.h를 생성awk와sed가sqlite3.h,opcodes.h,opcodes.c를 생성
opcodes.h는 VM 명령어에 숫자 값을 할당하고, opcodes.c는 디버깅 및 진단에 유용한 인간이 읽을 수 있는 이름과 opcode를 매핑합니다.
최근 릴리스에서는 단일 통합 파일 sqlite3.c와 sqlite3.h를 제공합니다. 통합 파일 사용의 장점은 다음과 같습니다:
- 5–10 % 정도 성능 향상
- 보다 공격적인 컴파일러 최적화 가능
- 빌드 과정 단순화
- 애플리케이션에 쉽게 임베드 가능
명령줄 유틸리티는 추가로 shell.c가 필요합니다.
Summary
- SQL은 바이트코드로 컴파일되어 특수 설계된 VM에 의해 실행됩니다.
- SQLite는 데이터베이스 수준 잠금을 통해 직렬 실행을 보장합니다.
- 저널링은 원자성 및 복구를 보장합니다.
- 각 데이터베이스는
sqlite_master가 앵커 역할을 하는 단일 네이티브 파일에 저장됩니다.
아키텍처는 모듈화되어 있으며, 깔끔하게 계층화되고, 퍼블릭 도메인에 완전 공개된 오픈 소스입니다.
Looking Ahead
다음 장에서는 데이터베이스와 저널 파일 저장 구조를 더 깊이 파헤쳐, SQLite의 디스크 상 레이아웃이 이러한 추상화를 어떻게 구현하는지 살펴볼 것입니다.
Further resources
- My SQLite experiments:
- FreeDevTools (open‑source hub for dev tools):
Reference: SQLite Database System: Design and Implementation. Sibsankar Haldar (n.d.).