我应该关注Postgres 9.3 Json数据类型的性能吗?

时间:2014-05-08 13:20:36

标签: sql json postgresql postgresql-9.3

在我的项目中,我实际上有包含json(嵌套)数据列的表,但它们不是JSON数据类型。对于一些json属性,我在同一个表中有一个列,这样我在搜索,排序等时可以有一些性能。就像使用关系数据一样。为了更好地理解,这里有一个我实际拥有的例子:

lb_reg_marcacao_especial

        Column        |            Type             | Modifiers
----------------------+-----------------------------+-----------
 id                   | integer                     | not null
 json                 | character varying           | not null
 nm_marcacao          | character varying           |
 dt_inclusao          | timestamp without time zone |
Indexes:
    "lb_reg_marcacao_especial_pkey" PRIMARY KEY, btree (id_reg)
    "lb_reg_marcacao_especial_nm_marcacao_key" UNIQUE CONSTRAINT, btree (nm_marcacao)

而json列的数据如下:

'{
  "dt_inclusao": "02/12/2013 11:05:27",
  "nm_user_inclusao": "Some name",
  "nested": {
    "nm_marcacao": "marc1",
    "dt_ultima_alteracao": ""
  },
  "nm_user_ultima_alteracao": "",
  "ds_marcacao": "marc1",
  "st_marcacao": true
}'

其中一些json数据有~100个键和大约3个嵌套级别。如您所见,数据被复制,因为我在json和表的列中有一些键(nm_marcacao和dt_inclusao)。

所以,我正在考虑将json列数据类型更改为JSON并删除其他列。你呢?

1 个答案:

答案 0 :(得分:1)

切换到JSON而不是文本有几个好处:

1)将验证数据以确认实际的JSON规范。您的服务器端应用程序可能已经这样做,但类型安全总是很好。

2)您可以访问多个JSON函数,例如任意路径的属性getter,转换为记录等等:

http://www.postgresql.org/docs/9.3/static/functions-json.html http://clarkdave.net/2013/06/what-can-you-do-with-postgresql-and-json/

要做setter,我建议一个简单的plv8函数,它接受3个输入(json对象,path-to-property,updated-value)并返回更新的json对象。这可以直接在更新语句中使用。

3)您实际上可以为性能索引JSON的某些属性:

How to create index on json field in Postgres 9.3

4)JSON 9.4将引入二进制存储,并且索引引擎的改进将大大提高速度:

http://obartunov.livejournal.com/177247.html

以下是关于9.3中JSON状态的精彩演讲:

http://www.slideshare.net/amdunstan/93json-26647827

以下是早期版本(使用原始hstore2工作)的性能报告,显示了相对于mongodb的一些性能 - 这是由jsonb作者提供的:

http://obartunov.livejournal.com/175235.html

以及来自其他人的更新基准:

https://plus.google.com/+ThomBrownUK/posts/1JizRBGPYBq