- SQLiteの既存のJSON関数を書き直し。利用パターンによっては数倍高速に実行される
- 従来のJSON関数は3段階で動作
- JSONをCコードが簡単に処理できる内部用バイナリ形式にパース
- 要求された処理を実行。特定フィールドを探したりJSONを修正したりするなど
- 処理が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件のコメント
Hacker Newsの意見
JSONBについては混乱が多い
jsonb_プレフィックス付きで利用できる。JSONBはPostgresが提供するフォーマットで、通常のJSONより読み取り性能が向上するため推奨されている。
ドキュメントストアの目的を理解するのに何年もかかったが、POC(Proof of Concept)の構築には非常に優れている。
SQLiteのリリースプロセスが気になる。
JSONBはプレリリースのスナップショットやプレイグラウンドで試せる。
JSONB仕様の核心的なアイデアは、各要素がサイズと型を含むヘッダーで始まるということだ。
MongoDBのBSONには慣れているが、JSONBにはなじみがない。
JSONBは性能に影響する。
複数行にまたがってJSONデータを圧縮する方法があればよいのにと思う。
内部形式にかかわらず、アプリケーションからすぐに利用できる。
json_eachは、アプリケーションからJSONB BLOBとしてバインドされたパラメータを受け取れる。