SQLite보다 138배나 빠르다고?! (Stoolap 벤치마크 테스트)

BBetter Stack
컴퓨터/소프트웨어AI/미래기술

Transcript

00:00:00새로운 프로젝트를 시작할 때 데이터베이스가 필요하다면, 가장 먼저 떠오르는
00:00:03옵션은 무엇인가요? SQLite인가요? 아마 SQLite겠죠? 정말 훌륭하고 안정적인 데다
00:00:09설정도 필요 없는 업계 표준이니까요. 하지만 로컬 데이터가 무거워지고 쿼리가
00:00:14복잡해지면서, 단일 스레드 파일 잠금 엔진이 가진
00:00:20한계에 부딪히기 시작했습니다. 그런데 이제 이러한 문제를 해결하려는 새로운 강자가 나타났습니다.
00:00:25바로 'Stulab'입니다. Rust로만 작성된 데이터베이스 엔진으로, 최근에
00:00:31네이티브 Node.js 드라이버를 출시했는데 정말 놀라운 성능을 보여주고 있습니다.
00:00:36이 데이터베이스는 SQLite보다 138배나 빠릅니다. 그래서 이번 영상에서는
00:00:43Stulab의 내부 구조와 작동 원리를 살펴보고, 라이브 벤치마크 테스트를 통해
00:00:50정말로 주장만큼 강력한지 확인해 보겠습니다. 아주 재미있을 테니 바로 시작하죠. Stulab이란 정확히 무엇일까요?
00:01:00기본적으로 Stulab은 임베디드 OLAP, 즉 온라인 분석 처리 데이터베이스입니다.
00:01:06SQLite나 Postgres 같은 표준 데이터베이스에 익숙하시다면, 그것들은 보통
00:01:14이름 그대로 트랜잭션에 최적화된 OLTP, 즉 온라인 트랜잭션 처리 데이터베이스입니다.
00:01:20하지만 Stulab은 다릅니다. 분석 작업 부하를 위해 설계되었으며, 고속 데이터 처리에 중점을 두고
00:01:27Rust로 바닥부터 구축되었습니다. SQLite 파일의 휴대성을 갖추면서도
00:01:33DuckDB나 BigQuery 같은 강력한 분석 능력을 갖췄다고 생각하시면 됩니다. 하지만 가장 멋진 점은
00:01:39네이티브 Node 드라이버 덕분에 이제 Node.js에서도 사용할 수 있다는 것입니다.
00:01:45네이티브 드라이버라고 해서 일반적인 래퍼(wrapper)를 말하는 게 아닙니다. 보통 데이터베이스가
00:01:49Rust나 C++ 같은 다른 언어로 작성되면, Node.js 앱은 브릿지를 통해 통신해야 합니다.
00:01:56이는 종종 데이터를 JSON 등으로 변환하여 로컬 네트워크 소켓으로 보내고,
00:02:02반대편에서 다시 변환하는 과정을 의미합니다. 이를 직렬화 오버헤드라고 부르며
00:02:08성능을 크게 떨어뜨리는 요인이 됩니다. 하지만 Stulab Node는 다르게 작동합니다. 바로 NAPI-RS를 사용하는데,
00:02:15이는 Rust 엔진을 네이티브 바이너리로 컴파일하여 Node.js 프로세스에
00:02:21직접 로드할 수 있게 해주는 프레임워크입니다. 따라서 중간에 브릿지나 번역기가 필요 없습니다.
00:02:27쿼리를 보낼 때 Node.js와 Rust는 사실상 동일한 메모리 공간을 공유합니다. Stulab이
00:02:33압도적으로 빠른 데에는 세 가지 큰 이유가 있습니다. 첫째, MVCC(다중 버전 동시성 제어)를 사용합니다.
00:02:40단일 작성자가 데이터베이스 전체를 잠글 수 있는 SQLite와 달리, Stulab은 여러 명의
00:02:47판독자와 작성자가 동시에 작업할 수 있습니다. 둘째, 병렬 실행을 사용합니다. Stulab은
00:02:53Rayon이라는 스케줄러를 사용합니다. 대규모 쿼리를 실행할 때 단일 CPU 코어에 맡기는 대신,
00:03:00쿼리를 분해하여 장비의 모든 코어를 활용합니다. 셋째, 비용 기반
00:03:06최적화 도구를 사용합니다. SQL을 맹목적으로 실행하는 것이 아니라, 데이터를 분석하고
00:03:13다양한 경로의 비용을 추정하여 결과를 얻는 가장 빠른 방법을 선택합니다. 이것이 바로 Stulab이
00:03:19SQLite보다 훨씬 빠르다고 주장하는 이유입니다. 그럼 실제로 그런지 테스트해 봅시다.
00:03:25이 테스트를 위해 간단한 Node.js 프로젝트를 만들고 Stulab과
00:03:30SQLite를 모두 종속성으로 설치하겠습니다. Stulab이 정말 빛을 발하는 부분 중 하나는 count distinct입니다.
00:03:37그래서 정말 그런지 궁금하네요. 각 데이터베이스의 인메모리 버전을 실행하고
00:03:43간단한 판매(sales) 테이블을 생성하는 간단한 스크립트를 준비했습니다. 그런 다음 이 테이블에
00:03:4910,000행의 랜덤 판매 데이터를 채웁니다. 각 행은 ID가 0에서 1,000 사이인 사용자의 판매를 나타내며
00:03:56특정 카테고리를 가집니다. 두 데이터베이스에 데이터를 일괄 삽입한 다음,
00:04:03특정 카테고리의 특정 사용자가 수행한 판매의 고유 개수(distinct count)를 선택하는
00:04:10벤치마크를 실행하여 각 데이터베이스의 성능을 계산할 것입니다. 여기서 한 가지
00:04:16언급해야 할 점은, 현재 설치된 패키지가 제대로 작동하지 않아 좀 답답하다는 것입니다.
00:04:22지금 벤치마크 테스트를 실행하면 네이티브 바인딩이 누락되었다는 오류가 뜹니다.
00:04:28프로젝트 작성자가 바이너리를 추가하거나 패키지에 올바르게 연결하는 것을 잊은 게 분명합니다.
00:04:34그래서 제가 직접 소스에서 빌드해야 했습니다. 레포지토리를 클론하고 내부에서 빌드를 실행한 후,
00:04:39다시 제 벤치마크 프로젝트로 돌아와 소스 디렉토리를 종속성으로 연결했습니다.
00:04:44현재로서는 좀 번거로운 일이라, 향후 프로젝트 작성자들이 이 문제를 해결해 주길 바랍니다.
00:04:49어쨌든, 그렇게 하고 나서야 드디어 벤치마크를 실행할 수 있게 되었습니다. 그럼 시작해 보죠.
00:04:54보시는 것처럼 count distinct 작업은 Stulab에서 확실히 훨씬 빠르지만,
00:05:01광고만큼은 아닙니다. 4배 정도 빠르네요. 그럼 채우려는 데이터의 개수에
00:05:070을 하나 더 추가해서 1,000,000행으로 다시 테스트를 실행하면 어떨까요? 한번 해봅시다.
00:05:12백만 행에서도 Stulab은 138배가 아니라 6배 정도만 빠릅니다. 그럼에도 불구하고
00:05:20여전히 훌륭한 결과입니다. 여기까지가 count distinct 테스트였고요. 저는
00:05:26distinct + order by 작업을 테스트하기 위해 또 다른 벤치마크 테스트를 해보기로 했습니다.
00:05:33두 번째 테스트에서는 다양한 IP 주소와 상태 코드가 포함된 랜덤 로그를 수집한 다음,
00:05:39IP 주소와 상태 코드 쌍으로 고유한 로그를 찾고, IP는 오름차순,
00:05:47상태 코드는 내림차순으로 정렬했습니다. 테스트를 실행해 보니 Stulab이 여전히 SQLite보다
00:05:53성능이 좋지만, 14배가 아니라 1배에서 1.5배 정도 더 빠를 뿐입니다. 제 생각에
00:06:01여기에 나열된 수치들은 약간 부풀려진 것 같습니다. 하지만 보셨다시피 Stulab이 SQLite보다 빠른 것은 사실입니다.
00:06:08공정하게 말하자면, 원작자도 SQLite가 Stulab보다 더 나은 성능을 보이는 영역을 언급했습니다.
00:06:13대부분 단일 행 작업을 수행하는 상황들입니다. 즉, Stulab은
00:06:19분석적이고 복잡한 쿼리에 적합합니다. 그렇다면 Stulab이 SQLite 킬러일까요? 솔직히 아닙니다.
00:06:26두 데이터베이스는 용도가 완전히 다릅니다. SQLite는 여전히 트랜잭션을 위한 안정적인 도구이며,
00:06:32Stulab은 데이터 분석을 위한 고성능 레이싱 카라고 볼 수 있습니다. 하지만
00:06:38NAPI-RS를 통해 Node.js 프로젝트에 바로 적용할 수 있는 순수 Rust 분석 엔진이
00:06:45나왔다는 사실은 정말 멋진 일입니다. 프로젝트 소유자가 현재 NPM 패키지만 잘 수정해서
00:06:50소스에서 직접 빌드할 필요 없게 해주면 좋겠네요. 지금까지 Stulab에 대해 간단히 살펴보았습니다.
00:06:55여러분은 어떻게 생각하시나요? Stulab으로 전환할 만큼 성능 향상이 매력적인가요,
00:07:01아니면 여전히 신뢰할 수 있는 SQLite를 사용하실 건가요? 아래 댓글로 알려주세요. 여러분,
00:07:06이 영상이 유용했다면 영상 아래의 좋아요 버튼을 눌러서 표현해 주세요. 그리고
00:07:11저희 채널 구독도 잊지 마시고요. 지금까지 Better Stack의 Andris였고,
00:07:17다음 영상에서 뵙겠습니다.

Key Takeaway

Stulab은 복잡한 분석 쿼리에서 SQLite보다 뛰어난 성능을 제공하는 Rust 기반 엔진이지만, 실제 성능 향상 폭은 작업 부하에 따라 다르므로 용도에 맞는 선택이 필요합니다.

Highlights

Stulab은 Rust로 작성된 임베디드 OLAP 데이터베이스로, 고속 분석 처리에 특화되어 있습니다.

NAPI-RS를 사용하여 Node.js와 Rust 엔진이 동일한 메모리 공간을 공유하므로 직렬화 오버헤드가 없습니다.

MVCC, Rayon 스케줄러를 통한 병렬 실행, 비용 기반 최적화 도구가 Stulab 성능의 핵심 비결입니다.

실제 벤치마크 결과, 100만 행 기준 count distinct 작업에서 SQLite보다 약 6배 빠른 성능을 보였습니다.

광고된 138배 속도 향상은 특정 조건에 한정된 수치이며, 단일 행 작업은 여전히 SQLite가 우세합니다.

Timeline

SQLite의 한계와 새로운 대안 Stulab의 등장

영상은 새로운 프로젝트 시작 시 업계 표준으로 통하는 SQLite의 인기를 언급하며 시작합니다. 하지만 로컬 데이터가 무거워지고 쿼리가 복잡해지면 SQLite의 단일 스레드 파일 잠금 방식이 성능 한계에 부딪히게 됩니다. 이러한 문제를 해결하기 위해 Rust로 구축된 새로운 데이터베이스 엔진인 Stulab이 등장했습니다. 최근 출시된 네이티브 Node.js 드라이버는 기존 방식보다 훨씬 놀라운 성능을 보여줍니다. 이 섹션은 왜 우리가 기존 SQLite를 넘어 새로운 대안을 고려해야 하는지 그 배경을 설명합니다.

Stulab의 구조: OLAP와 네이티브 드라이버의 특징

Stulab은 트랜잭션 중심의 OLTP인 SQLite나 Postgres와 달리 분석 처리에 최적화된 임베디드 OLAP 데이터베이스입니다. DuckDB나 BigQuery와 유사한 분석 능력을 갖추면서도 SQLite처럼 파일 기반의 휴대성을 제공하는 것이 특징입니다. 특히 NAPI-RS 프레임워크를 활용하여 Rust 엔진을 Node.js 프로세스에 직접 로드하는 방식을 취합니다. 이를 통해 중간 브릿지나 JSON 변환 과정에서 발생하는 직렬화 오버헤드를 완전히 제거했습니다. 결과적으로 Node.js와 Rust가 동일한 메모리 공간을 공유하며 통신하는 혁신적인 구조를 가집니다.

Stulab이 압도적으로 빠른 세 가지 기술적 이유

Stulab의 고속 성능을 뒷받침하는 세 가지 핵심 기술 요소가 상세히 소개됩니다. 첫째는 MVCC(다중 버전 동시성 제어)를 도입하여 여러 사용자가 동시에 읽고 쓸 수 있도록 구현한 점입니다. 둘째는 Rayon 스케줄러를 사용하여 단일 코어가 아닌 장비의 모든 CPU 코어를 활용하는 병렬 실행 기술입니다. 셋째는 SQL 실행 전 다양한 경로의 비용을 추정하여 최적의 실행 계획을 세우는 비용 기반 최적화 도구입니다. 이 기술들은 Stulab이 왜 기존 데이터베이스보다 효율적인지 논리적인 근거를 제시합니다.

실전 벤치마크 테스트: 1만 행과 100만 행 비교

실제 성능 검증을 위해 Node.js 환경에서 SQLite와 Stulab의 벤치마크 테스트를 진행합니다. 초기 설정 과정에서 NPM 패키지의 바이너리 누락 오류가 발생하여 소스에서 직접 빌드해야 했던 번거로움도 솔직하게 공유합니다. 1만 행의 판매 데이터를 대상으로 한 count distinct 테스트에서 Stulab은 SQLite보다 4배 빠른 결과를 보여주었습니다. 데이터 규모를 100만 행으로 늘렸을 때도 약 6배의 성능 향상을 기록하며 분석 작업에서의 우위를 증명했습니다. 다만 광고에서 주장하던 138배라는 수치와는 다소 차이가 있음을 확인시켜 줍니다.

추가 성능 테스트 및 최종 결론: SQLite 킬러인가?

정렬 작업이 포함된 두 번째 벤치마크에서는 Stulab이 약 1.5배 정도의 근소한 우위를 보이며 작업 유형에 따라 성능 차이가 있음을 보여줍니다. 제작자는 Stulab이 모든 상황에서 SQLite를 대체하는 '킬러'는 아니라고 결론짓습니다. 단일 행 작업이나 일반적인 트랜잭션은 여전히 SQLite가 안정적이고 빠르기 때문입니다. 하지만 복잡한 데이터 분석이 필요한 Node.js 프로젝트라면 Stulab은 매우 매력적인 고성능 도구가 될 수 있습니다. 마지막으로 패키지 설치 문제 해결을 희망하며 시청자들의 의견을 묻고 영상을 마무리합니다.

Community Posts

View all posts