- SQLite의 단일 작성자 구조와 내장형 특성이 오히려 확장성과 성능을 높이는 요인으로 작용함을 실험으로 입증
- 동일한 조건에서 Postgres는 네트워크 지연 시 348 TPS까지 하락했지만, SQLite는 네트워크 제거로 44,096 TPS를 달성
- 단일 작성자 모델을 활용한 배치 처리와 SAVEPOINT 기반 세분화 트랜잭션으로 최대 186,157 TPS, 안정적 구성 시 102,545 TPS 기록
- Amdahl의 법칙이 네트워크 기반 데이터베이스의 병목을 설명하며, SQLite는 이를 회피함으로써 높은 효율을 유지
- 이 결과는 로컬 환경에서의 SQLite 활용 가능성과 네트워크 병목 제거의 중요성을 강조함
SQLite의 구조와 실험 환경
- SQLite는 MVCC가 없고 단일 작성자만 허용하지만, 이러한 구조가 오히려 높은 확장성을 가능하게 함
- 내장형 데이터베이스로서 네트워크 오버헤드가 없음
- 벤치마크는 Apple M1 Pro, 16GB 메모리의 MacBook Pro(2021) 환경에서 수행
- 실험은 완벽한 최적화가 아닌, 일반적인 조건에서도 높은 쓰기 처리량을 달성할 수 있음을 보여주는 목적으로 진행
TPS 정의와 트랜잭션 예시
- TPS는 단순한 쓰기 속도가 아니라 상호작용형 트랜잭션(Interactive Transaction) 을 의미
- 예: 계좌 간 송금 시 여러 쿼리와 애플리케이션 코드가 하나의 트랜잭션 내에서 실행
- 트랜잭션은 오류 발생 시 상태를 롤백할 수 있어 일관성 유지에 핵심적 역할
벤치마크 구성
- Clojure 기반 가상 스레드(virtual threads) 를 사용해 대규모 동시 요청을 시뮬레이션
- Postgres는 HikariCP 기반 커넥션 풀로 구성, SQLite는 단일 작성자와 코어 수만큼의 읽기 연결을 사용
- 두 데이터베이스 모두 id, balance 필드를 가진 단순한 account 테이블을 사용하며, 10억 개의 행을 삽입
- 사용자 활동은 파워 법칙 분포(0.9995) 를 따르며, 약 10만 명의 활성 사용자가 존재
네트워크 데이터베이스(Postgres) 성능
- 동일 서버 내에서 Postgres는 13,756 TPS 달성
- 네트워크 지연 5ms 추가 시 1,214 TPS, 10ms 시 702 TPS로 급감
- 직렬화 격리 수준 적용 후 660 TPS, 추가 쿼리 포함 시 348 TPS로 하락
- 이는 Amdahl의 법칙에 따라 네트워크 병목이 전체 성능을 제한함을 보여줌
- 네트워크 지연이 증가하면 트랜잭션 락 경쟁이 심화되어 확장 불가능
SQLite의 내장형 이점
- 네트워크 제거 후 SQLite는 44,096 TPS 달성
- 네트워크 병목이 사라지면서 Amdahl의 법칙의 영향을 최소화
- 단일 작성자 구조를 활용해 배치 처리(batch processing) 적용 시 186,157 TPS까지 상승
- 동적 배치 크기 조정으로 지연(latency)과 처리량(throughput) 을 자동 최적화
SAVEPOINT를 통한 세분화 트랜잭션
- 배치 내 개별 트랜잭션 실패를 방지하기 위해 SAVEPOINT를 사용한 중첩 트랜잭션 적용
- 실패 시 해당 트랜잭션만 롤백, 전체 배치는 유지
- 이 방식으로도 121,922 TPS 유지
읽기/쓰기 혼합 부하 테스트
- 전체 요청의 75%를 읽기, 25%를 쓰기로 구성
- 별도의 읽기 스레드 풀을 사용하여 읽기 요청이 쓰기를 방해하지 않도록 분리
- 결과적으로 102,545 TPS 달성
성능 비교 요약
| 조건 | Postgres | SQLite |
|---|---|---|
| 네트워크 없음 | 13,756 | 44,096 |
| 5ms 지연 | 1,214 | n/a |
| 10ms 지연 | 702 | n/a |
| 10ms + 직렬화 | 660 | n/a |
| 배치 처리 | n/a | 186,157 |
| 배치 + SAVEPOINT | n/a | 121,922 |
| 배치 + SAVEPOINT + 읽기 | n/a | 102,545 |
결론
- SQLite는 단일 작성자 모델과 내장형 구조 덕분에 네트워크 기반 데이터베이스보다 훨씬 높은 TPS를 달성
- Amdahl의 법칙이 제시하는 네트워크 병목 한계를 회피함으로써 효율성을 극대화
- 전체 코드는 GitHub에서 공개되어 있으며, 관련 주제로 Amdahl의 법칙, 파워 법칙, SQLite 확장 사례 등의 자료가 함께 제시됨
- SQLite는 로컬 환경에서의 고성능 트랜잭션 처리에 매우 효과적인 선택지임