1P by GN⁺ | ★ favorite | 댓글 1개
  • SQLite Page Explorer는 SQLite 데이터베이스를 SQLite가 보는 방식대로 디스크 페이지 단위로 탐색할 수 있는 작은 GUI 애플리케이션임
  • 개발자가 보통 다루는 테이블·행·SQL 같은 스키마 수준이 아니라 페이지 수준을 보여줘, 인덱스의 실제 디스크 구조와 저장 효율을 살펴볼 수 있음
  • redbean, cosmopolitan, αcτµαlly pδrταblε εxεcµταblε를 사용해 6.5MB 단일 실행 파일로 Windows, Linux, MacOS, 여러 BSD, ARM64와 x64에서 네이티브 실행됨
  • 실행 파일은 Lua 코드와 데이터베이스 바이너리 포맷 파서 등을 담은 zip 파일이기도 하며, 데이터베이스 파일을 드래그하거나 콘솔에서 실행하면 브라우저 탭으로 앱이 열림
  • APE 방식 실행 파일은 브라우저나 운영체제 바이러스 탐지에서 오탐을 만들 수 있고, 500MB 이상 대형 데이터베이스는 최상위 뷰 로딩이 느릴 가능성이 있음

SQLite 페이지를 직접 보는 GUI

  • SQLite Page Explorer는 SQLite 데이터베이스를 “page by page”로 탐색하는 작은 GUI 애플리케이션임
  • SQLite와 대부분의 데이터베이스는 보통 4KB 크기의 디스크 블록 페이지에 데이터를 저장하며, 이는 읽기와 쓰기를 빠르게 하기 위한 구조임
  • 일반적인 개발자 작업은 테이블, 행, SQL 같은 스키마 수준에서 이루어지지만, 이 도구는 SQLite가 보는 페이지 수준을 들여다보게 함

페이지 수준 탐색으로 볼 수 있는 것

  • 인덱스가 디스크에서 실제로 어떤 모습인지 확인할 수 있음
    • 인덱스는 기본적으로 별도의 작은 테이블처럼 저장됨
  • 데이터를 더 컴팩트하게 저장하는 방법을 살펴볼 수 있고, 쿼리와 애플리케이션을 더 빠르게 만드는 데 연결될 수 있음
  • 스키마 수준에서는 보이지 않을 수 있는 문제와 비효율을 찾는 데 도움이 됨
  • 파일시스템과 데이터베이스의 기반이 되는 중요한 자료구조인 B-Tree에 대한 직관을 얻을 수 있음

단일 실행 파일로 어디서나 실행

  • redbean, cosmopolitan, αcτµαlly pδrταblε εxεcµταblε를 사용해 단일 6.5MB 실행 파일로 배포됨
  • Windows, Linux, MacOS, 여러 BSD에서 실행되며, ARM64와 x64를 모두 지원함
  • 실행 파일은 앱을 구동하는 Lua 코드, 데이터베이스 바이너리 포맷 파서 등을 포함한 zip 파일이기도 함

설치와 실행 방식

  • 릴리스 페이지에서 sqlite-page-explorer.com을 다운로드함
  • Unix 계열에서는 chmod +x를 실행함
  • 데이터베이스 파일을 실행 파일에 드래그하거나 콘솔에서 다음처럼 실행함
    • sqlite-page-explorer.com mySqliteDatabase.db
  • 앱은 브라우저 탭에서 열림
  • 사용을 마치면 콘솔에서 Ctrl-C를 두 번 누름

주의점과 개발 방식

  • APE 실행 파일은 브라우저나 운영체제 바이러스 탐지에서 오탐을 만들 수 있음
    • llamafile 같은 프로젝트도 같은 폴리글롯 바이너리 기법을 사용함
    • 인터넷에서 내려받는 파일에는 일반적인 주의가 필요함
  • 500MB 이상 큰 데이터베이스를 넣으면 모든 페이지를 읽는 최상위 뷰 로딩이 느릴 가능성이 있음
  • 빌드는 files/ 내용을 redbean-3.0.0-cosmos.com에 zip으로 넣는 방식임
    • 포함된 zipitup.py Python 3.6+ 스크립트로도 빌드할 수 있음
  • 개발 중에는 redbean-3.0.0-cosmos.com -D filesfiles 하위 디렉터리에서 앱을 서빙해 매번 zip을 다시 만들지 않아도 됨
  • 프로젝트는 redbean 실험과 첫 Lua 사용의 일부였으며, 코드가 더 정리될 여지가 있음
    • 템플릿 시스템이 문자열 연결과 Write() 호출을 줄이는 데 도움이 될 수 있음
    • 마지막 탭이 닫히면 콘솔을 자동 종료하거나, 거대 데이터베이스에서 사용자 확인 전 10,000페이지쯤에서 멈추는 개선 아이디어가 있음
    • PR을 환영함

댓글과 토론

Hacker News 의견들
  • 정말 멋짐. 여기 애니메이션 GIF 스크린샷을 올려뒀음: https://simonwillison.net/2025/Feb/6/sqlite-page-explorer/

    • 영광임 :) 이걸 만들면서 “SimonW가 좋아할 만한 것 같은데”라는 생각이 들었음. 훌륭한 LLM 실험과 글들을 많이 공유해줘서 고마움
  • 멋짐! SQLite 파일 형식 문서를 옆에 두고 SQLite 파일을 파싱하는 코드를 직접 쓰기 시작하는 게 의외로 쉬움
    이 프로젝트가 하는 방식과 비슷하고, README의 “Why?” 섹션에 적힌 이유들 때문에 강력히 추천함
    https://www.sqlite.org/fileformat.html

  • 정말 인상적임! 예전에 SQLite 내부 구조를 다뤄본 입장에서, 이런 작업과 실험이 결코 작은 일이 아니라는 걸 앎
    관련해서 최근에 sqlite-repr [1]을 봤는데, Dioxus로 만들어졌고 SQLite 시각화에 대한 흥미로운 접근을 보여줌
    [1] https://torymur.github.io/sqlite-repr/

  • 10년도 더 전에 보안 도구를 만들면서 이런 걸 해봤음. 그렇게 해보면 촘촘하게 설계된 엔진이 더 좋아짐
    탐색기나 기본 라이브러리만 있어도 재미있겠다고 늘 생각했는데, 특히 MIT 라이선스로 공개된 걸 보니 반가움

  • 멋져 보임, 잘 만들었음
    첫 화면에 색상 범례를 추가하면 좋을 듯함. 처음에는 색이 뭘 의미하는지 몰랐음
    큰 데이터베이스에서는 좀 버거워하는 듯함. 3.6GB, 942719페이지짜리였는데, 페이지를 나눠 보여주면 좋을 것 같음

    • 마우스를 올리면 페이지 종류가 title 속성으로 보여서 색상 체계를 알 수는 있지만, 아주 명확하진 않음
      큰 데이터베이스가 느려지는 것도 맞음. 페이지를 “서버 쪽”에서 순회하므로 수십만 개가 있으면 시간이 걸림
      이상적으로는 실시간 스크롤 페이지 범위 API가 좋겠지만, 단순히 “다음 1만 페이지 보기” 같은 방식도 가능할 듯함
  • 좋은 프로젝트인데, 실행 파일을 돌리면 "failed to run lua code: /index.lua:3: module 'utils' not found:" 오류가 남

  • 강의나 수업을 끝까지 들을 만큼 disciplined하지 않은 입장에서, 내부에서 무슨 일이 일어나는지와 데이터를 더 효율적으로 구조화하는 방법을 시각적으로 이해하기에 정말 좋았음

  • 최근에 SQLite 파일 형식을 설명하는 글을 썼고, 도움이 될 만한 다이어그램도 넣어뒀음. 도움이 될 수 있음
    https://blog.jabid.in/2024/11/24/sqlite.html

  • SQLite 소스에는 데이터베이스 파일을 들여다보기 좋은 showdb라는 CLI 도구가 포함돼 있음

  • 멋짐. 데이터베이스를 배우는 중인데 아주 도움이 됨