SQLite 직접 만들어보기 Step 0 - SQLite 아키텍처 살펴보기
SQLite 아키텍처 다이어그램
개요
- SQLite 의 동작을 간단히 설명하자면, SQL 텍스트 정보를 바이트 코드로 컴파일하고 가상 머신에서 바이트코드를 동작시킨다.
- sqlite3_prepare_v2() 는 인터페이스로 SQL 텍스트를 바이트코드로 변환시키는 컴파일러 역할을 한다.
- sqlite3_stmt 객체는 단일 SQL 문을 구현하는 바이트코드 프로그램에 대한 컨테이너이다.
- sqlite3_step() 인터페이스는 바이트코드 프로그램을 가상머신으로 넘기고 프로그램이 완료될 때까지 실행한다. 완료의 의미는 아래 3가지 중 하나이다.
- 결과를 반환한다.
- 에러를 던진다.
- 인터럽트 된다.
인터페이스 (Interface)
아키텍처 그림에서 Core 부분 (초록색) 의 맨 위에 있다.
- 인터페이스를 통해 SQL 명령어로 DB 와 상호작용할 수 있다.
토크나이저 (Tokenizer)
- SQL 문은 가장 먼저 토크나이저로 보내진다.
- SQL 텍스트를 토큰으로 분리하고 구문 분석기에 하나씩 전달한다.
- SQLite 의 설계에서는 토크나이저가 파서를 호출한다.
tokenize.c
파일에 코드가 있다.
파서 (Parser)
- 파서는 컨텍스트에 따라 토큰에 의미를 할당한다.
- SQLite 파서는 Lemon parser generator 를 이용해 생성됐다.
- Lemon 은 재진입 가능하고 스레드에 안전한 파서를 생성한다.
- Lemon 은 구문 오류가 발생했을 때 메모리 누수가 일어나지 않도록 비종료 소멸자(non-terminal destructor) 의 개념을 정의한다.
SQLite 가 이해하는 SQL 언어를 정의하는 문법 파일은
parse.y
에 있다.
코드 제너레이터 (Code Generator)
- 파서가 토큰을 구문 분석 트리(parse tree) 로 조립한다.
- 코드 생성기는 구문 분석 트리를 분석하고 SQL 문의 작업을 수행하는 바이트코드를 생성한다.
prepared statement
객체는 이 바이트코드를 위한 컨테이너이다.- 내부적으로 쿼리 플래너 라는 것이 있는데, 이는 몇백만가지 경우의 수 중 가장 좋은 알고리즘을 고르기 위해 노력한다.
바이트코드 엔진 (Bytecode Engine)
- 바이트코드 프로그램은 코드 제너레이터에 의해 생성되어 가상머신에 의해 동작한다.
- SQL 문을 실행하고 데이터베이스의 내부 작업을 관리하는 역할을 한다.
- SQL 문을 실행하기 위한 효율적이고 컴팩트한 매커니즘을 제공한다.
비트리 (B-Tree)
- SQLite DB는 비트리 구현을 사용하여 디스크에서 유지 관리된다.
- DB 의 각 테이블과 각 인덱스에 대해 별도의 비트리가 사용된다.
- 모든 비트리는 동일한 디스크 파일에 저장된다.
- 파일 형식 세부 사항은 안정적이고 잘 정의되어 있으며 향후 호환성을 보장한다.
페이지 캐시 (Page Cache)
- 비트리 모듈은 디스크에서 고정 크기 페이지로 정보를 요청한다.
- 기본 page_size 는 4096 바이트이지만, 512 바이트에서 65536 바이트 사이의 2의 n 승이 될 수 있다.
- 페이지 캐시는 페이지의 읽기, 쓰기, 캐싱을 담당한다.
- 페이지 캐시는 롤백 및 원자 커밋 추상화를 제공한다.
- 페이지 캐시는 데이터베이스 파일 잠금을 처리한다.
- 비트리 드라이버는 페이지 캐시에서 특정 페이지를 요청하고 페이지를 수정하거나 변경 사항을 커밋 혹은 롤백하고자 할 때 페이지 캐시에 알린다.
- 페이지 캐시는 요청이 빠르고 안전하고 효율적으로 처리되도록 하는 모든 복잡한 세부사항을 처리한다.
OS 인터페이스 (OS Interface)
- 운영체제간 이식성을 제공하기 위해 SQLite는 VFS 라는 추상 객체를 사용한다.
- VFS 는 디스크에서 파일 열기, 읽기, 쓰기, 닫기 메서드와 현재 시간을 얻는 등의 OS 별 작업을 위한 메서드를 제공한다.
유틸리티 (Utilities)
- 메모리 할당, 대소문자 무시 문자열 비교, 텍스트-숫자 변환 등 기타 유틸들이 있다.
- 의사 난수 생성 유틸도 있다.
테스트 코드 (Test Code)
src
디렉토리 아래 있는 파일 중 이름이 test 로 시작하는 파일에는 테스트가 들어있다.- 라이브러리 표준 빌드에는 포함되지 않는다.
반응형
'데이터베이스 > SQLite 직접 만들어보기' 카테고리의 다른 글
SQLite 직접 만들어보기 Step 3 - 메모리에서만 동작하는 단일 테이블 DB 만들어보기 (0) | 2023.06.09 |
---|---|
SQLite 직접 만들어보기 Step 2 - 세상에서 가장 간단한 SQL 컴파일러와 가상머신 만들어보기 (0) | 2023.06.08 |
SQLite 직접 만들어보기 Step 1 - 매우 간단한 REPL 만들어보기 (0) | 2023.06.08 |