我对此没有任何经验,但这让我很好奇,所以我做了一些阅读。
仅 JSON
像下面这样的东西(未经测试,顺便说一句)呢?它没有解决您关于存储 JSON 的二进制表示的问题,它试图为您正在检查的所有行一次解析所有 JSON,希望通过减少处理来产生更高的性能为每一行单独执行此操作的开销。如果它成功了,我认为它可能会导致更高的内存消耗。
这些CREATE TYPE...set_of_records()
东西改编自wiki上的示例,其中提到“您还可以返回带有 JSON 数组的记录”。我想它真的意味着“一组对象”。
数据库记录中的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%'
hstore
这个比较的性能如何?:在写入时将 JSON 数据复制到 hstore 列中(或者如果性能以某种方式设法足够好,在选择时将 JSON 转换为 hstore)并在您的 中使用 hstore WHERE
,例如:
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 支持,我们很乐意为您提供帮助...