経験はありませんが、気になったので読んでみました。
JSONのみ
次のようなものはどうですか(未テスト、BTW)?JSONのバイナリ表現の保存に関する質問には対応していません。処理を減らすことでパフォーマンスが向上することを期待して、チェックしているすべての行に対してすべてのJSONを一度に解析しようとしています。行ごとに個別に行うオーバーヘッド。それが成功すると、メモリ消費量が増える可能性があると思います。
この内容は、「JSON の配列でレコードを返すこともできます」と言及されているwikiCREATE TYPE...set_of_records()
の例から改作されています。それは本当に「オブジェクトの配列」を意味していると思います。
DB レコードのid
値は JSON に埋め込まれていますか?
バージョン #1
CREATE TYPE rec AS (id integer, data text, name text);
CREATE FUNCTION set_of_records() RETURNS SETOF rec AS
$$
var records = plv8.execute( "SELECT id, data FROM things" );
var data = [];
// Use for loop instead if better performance
records.forEach( function ( rec, i, arr ) {
data.push( rec.data );
} );
data = "[" + data.join( "," ) + "]";
data = JSON.parse( data );
records.forEach( function ( rec, i, arr ) {
rec.name = data[ i ].name;
} );
return records;
$$
LANGUAGE plv8;
SELECT id, data FROM set_of_records() WHERE name LIKE 'Z%'
バージョン #2
これは、Postgres にいくつかの値を集約/連結させて、JS で行われる処理を削減します。
CREATE TYPE rec AS (id integer, data text, name text);
CREATE FUNCTION set_of_records() RETURNS SETOF rec AS
$$
var cols = plv8.execute(
"SELECT" +
"array_agg( id ORDER BY id ) AS id," +
"string_agg( data, ',' ORDER BY id ) AS data" +
"FROM things"
)[0];
cols.data = JSON.parse( "[" + cols.data + "]" );
var records = cols.id;
// Use for loop if better performance
records.forEach( function ( id, i, arr ) {
arr[ i ] = {
id : id,
data : cols.data[ i ],
name : cols.data[ i ].name
};
} );
return records;
$$
LANGUAGE plv8;
SELECT id, data FROM set_of_records() WHERE name LIKE 'Z%'
hストア
この比較のパフォーマンスはどうなりますか?: 書き込み時に JSON データを hstore 列に複製し (または、パフォーマンスが何とか十分に良好である場合は、選択時に JSON を hstore に変換します)、あなたのWHERE
で hstore を使用します。
SELECT id, data FROM things WHERE hstore_data -> name LIKE 'Z%'
ここから hstore について聞いた: http://lwn.net/Articles/497069/
この記事では、他にも興味深いことがいくつか言及されています。
PL/v8 では、特定の JSON 要素に式インデックスを作成して保存し、CouchDB の「ビュー」によく似た格納された検索インデックスを提供できます。
それについて詳しく説明されておらず、私はそれが何を指しているのか本当にわかりません。
「jberkus」というコメントがあり、次のように書かれています。
バイナリの JSON 型も検討しましたが、バイナリ値を送信するためのプロトコルがなければ (BSON はまったく標準ではなく、いくつかの深刻な不具合があります)、何の意味もないように思われました。
PostgreSQL のバイナリ JSON サポートに関心がある場合は、ぜひご協力ください...