web-dev-qa-db-ja.com

大きなドキュメントでのPostgreSQL JSONフィールドのパフォーマンス

Postgre JSONタイプは、大規模なJSONドキュメントに対してどの程度最適化されていますか?私は特に、JSONオブジェクトのサイズが複数MBであり、効率的にロードするには大きすぎる場合に、部分的な取得(JSON配列の最後のNアイテムを取得するコスト、またはJSON dictで特定のアイテムを1つ検索するコスト)について懸念しています。略さずに。

背景:各レコードに10,000の注釈が含まれているデータセットを使用しています。これらの注釈には完全なインデックスを付ける必要はありませんが、レコードをすばやく挿入する必要があるため、マッピングテーブルに数千の追加行を作成するのではなく、JSONフィールドに保存することを検討しています。

これはPostgreSQL 9.3に関連しています。

3
lyschoening

PostgreSQL 9.3では、大きなjsonドキュメントのパフォーマンスはかなり低くなります。フィールドにアクセスしたり、配列にインデックスを付けたりするには、ドキュメント全体を解析する必要があります。ドキュメントは、単純なテキスト表現であるjsonテキストとしてディスクに保存されます。

PostgreSQL 9.4はこれを変更する可能性が高く、ディスク上のjsonbストレージをサポートします。それでも、jsonオブジェクト全体をディスクから読み取ってその一部にアクセスする必要がありますが、9.3で見られるのと同じ種類の解析オーバーヘッドはありません。また、hstoreの多くのインデックス機能も利用できます。

9.3では、hstoreはディスク上のコンパクトなバイナリ表現で保存され、さまざまなインデックス機能をサポートしているので、ニーズにより適していると強く思います。

4
Craig Ringer

それは役立つかもしれません:sqlステートメントに、jsonフィールドがあるこの「キャスト」を追加しました:

INSERT INTO map_file(type, data)
VALUES (?, CAST(? AS json))
RETURNING id

map_fileテーブルへの「data」のデータ型は、jsonです。

0
Alejandro Hdz