13 ポイント 投稿者 GN⁺ 2023-12-07 | 1件のコメント | WhatsAppで共有
  • SQLiteの既存のJSON関数を書き直し。利用パターンによっては数倍高速に実行される
  • 従来のJSON関数は3段階で動作
    1. JSONをCコードが簡単に処理できる内部用バイナリ形式にパース
    2. 要求された処理を実行。特定フィールドを探したりJSONを修正したりするなど
    3. 処理がJSONを変更した場合、内部バイナリ形式をRFC-8279 JSON文字列に変換して出力または保存
  • 2段階目以外の1と3はオーバーヘッド
  • SQLiteは多数のポインタを含む内部バイナリ形式のJSONを使用していた。Cプログラムには適しているがシリアライズが難しい
  • JSONBへの書き直しにより、このJSONの内部バイナリ表現をSQL BLOBとして読み書きできる連続バイト配列に変更
  • これにより、内部で使用するJSON表現をJSONテキストの代わりにデータベースへ保存できるため、1段階目と3段階目のオーバーヘッドを取り除ける

変更点

  • 既存機能はすべてそのまま維持され、新機能のみ追加
  • これでJSONテキストを入力として受け取るすべてのJSON関数は、同じ引数に対してJSONBバイナリコンテンツも受け取れる
    • 関数にテキストを受け取るのかバイナリデータを受け取るのかを知らせる必要はない。関数が自動的に判別する
  • これでJSONを出力するJSON関数は2つのバージョンで提供される
    • 既存の json_ 関数は従来どおりに動作
    • テキストJSONではなくJSONBを返す jsonb_ 関数があり、通常の処理では3段階目が省略される
  • アプリケーションを変更しなくても速度はわずかに(1%)向上するが、すべては従来どおり動作し続ける
  • しかしアプリケーションを修正して、テキストJSONの代わりにJSONBを保存し始めると、少なくともJSON集約的な処理では3倍の性能向上が見込める
  • またJSONBは多くの場合、テキストJSONよりわずかに小さい(約5%または10%小さい)ため、JSONを多用する場合はデータベースサイズが少し縮小する可能性もある

1件のコメント

 
GN⁺ 2023-12-07
Hacker Newsの意見
  • JSONBについては混乱が多い

    • JSONBは、アプリケーションではJSONデータ型と非常によく似た形で使われる。
    • アプリケーションは引き続きJSON文字列を読み書きするが、実際のJSONBの内容を見ることはない。
    • 同じSQL関数が、jsonb_プレフィックス付きで利用できる。
    • JSONデータ型はディスク上にJSONとして保存されるが、JSONBは特別なバイナリ形式で保存される。
    • JSONデータ型は処理を行うためにJSON全体をパースする必要があるが、JSONBはそのパース段階を省略し、ディスク形式に直接対して処理できる。
    • SQLiteでJSON blob全体を単に読み書きするだけならJSONデータ型が適しているが、SQLを使ってデータをクエリしたり操作したりするならJSONBのほうが適している。
  • JSONBはPostgresが提供するフォーマットで、通常のJSONより読み取り性能が向上するため推奨されている。

  • ドキュメントストアの目的を理解するのに何年もかかったが、POC(Proof of Concept)の構築には非常に優れている。

    • JSONサポートの強化は、SQLiteを適切なドキュメントストアにする助けになるだろう。
    • Protobufメッセージをシリアライズ/デシリアライズして完全な型サポートを得て、このカラムをJSONBにすれば、検索可能なデータを別のカラムに展開しなくてもこのカラムでフィルタリングできる。
  • SQLiteのリリースプロセスが気になる。

    • 最新リリースは3.44で、JSONBはプレリリースのスナップショットに含まれている。
    • CloudflareのD1やFly.ioでこの機能を使いたいが、SQLiteのバージョンが公開されていないか、カスタマイズされている可能性がある。
    • APIの変更によって、SQLite互換のダンプ/クエリファイルをインポートできるというCloudflareの約束が破られる可能性がある。
  • JSONBはプレリリースのスナップショットやプレイグラウンドで試せる。

  • JSONB仕様の核心的なアイデアは、各要素がサイズと型を含むヘッダーで始まるということだ。

    • JSON仕様にサイズ表示を追加すれば、JSON処理に必要なメモリを減らせる可能性があると提案している。
  • MongoDBのBSONには慣れているが、JSONBにはなじみがない。

    • JSONBとBSONの違いを説明したブログ記事を参照している。
  • JSONBは性能に影響する。

    • 多くの人はPostgresでJSONBを知っているだろう。
    • PGConf NYC 2021でOleg Bartunovが発表した「Jsonb性能の理解」という講演を見ることを勧める。
    • Jsonb性能の理解 講演動画
  • 複数行にまたがってJSONデータを圧縮する方法があればよいのにと思う。

    • 各行に非常によく似たblobがあり、多くの類似したblobについて行をまたいで保存領域を減らす方法が必要だ。
  • 内部形式にかかわらず、アプリケーションからすぐに利用できる。

    • たとえばPythonでのバルク挿入では、1行ごとの挿入呼び出しに目立つオーバーヘッドがある。
    • JSONBはCTE(Common Table Expressions)を使うことで性能を改善できる。
    • json_eachは、アプリケーションからJSONB BLOBとしてバインドされたパラメータを受け取れる。