1 ポイント 投稿者 GN⁺ 2025-02-08 | 1件のコメント | WhatsAppで共有
  • 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方式の実行ファイルは、ブラウザやOSのウイルス検知で誤検知を引き起こすことがあり、500MB以上の大規模データベースでは最上位ビューの読み込みが遅くなる可能性がある

SQLiteのページを直接見るGUI

  • SQLite Page Explorerは、SQLiteデータベースを“page by page”で探索する小さなGUIアプリケーション
  • SQLiteや大半のデータベースは、通常4KBサイズのディスクブロックページにデータを保存しており、これは読み書きを高速化するための構造
  • 一般的な開発者の作業は、テーブル、行、SQLといったスキーマレベルで行われるが、このツールはSQLiteが見るページレベルをのぞき込めるようにする

ページレベル探索で見えるもの

  • インデックスがディスク上で実際にどのような姿をしているか確認できる
    • インデックスは基本的に別個の小さなテーブルのように保存される
  • データをよりコンパクトに保存する方法を調べられ、クエリやアプリケーションの高速化につながる可能性がある
  • スキーマレベルでは見えない問題や非効率を見つける助けになる
  • ファイルシステムやデータベースの基盤となる重要なデータ構造であるB-Treeへの直感を得られる

単一実行ファイルでどこでも動く

  • redbeancosmopolitanα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を2回押す

注意点と開発方式

  • APE実行ファイルは、ブラウザやOSのウイルス検知で誤検知を引き起こすことがある
    • 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歓迎

1件のコメント

 
GN⁺ 2025-02-08
Hacker News のコメント
  • 本当にすばらしい。ここに アニメーション GIF のスクリーンショットを載せておいた: https://simonwillison.net/2025/Feb/6/sqlite-page-explorer/

    • 光栄です :) これを作りながら「SimonW が気に入りそうだな」と思っていました。すばらしい LLM 実験や記事をたくさん共有してくれてありがとう
  • すばらしい! SQLite ファイル形式ドキュメントを横に置いて、SQLite ファイルをパースするコードを自分で書き始めるのは、意外と簡単
    このプロジェクトのやり方に似ているし、README の「Why?」セクションに書かれている理由からも強くおすすめする
    https://www.sqlite.org/fileformat.html

    • その通り、ファイル形式は読みやすい! 一度腰を据えて、数時間で リーダー実装までできた
      可視化ツールも少しあるが、元記事のソフトウェアより機能はずっと少ない: https://www.nayuki.io/page/sqlite-database-file-visualizatio...
    • ちょうど今日これを使ってみたが、役に立った
  • 本当に印象的! 以前 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 ツールが含まれている

  • すばらしい。データベースを学んでいるところだが、とても役に立つ