PostgreSQL 在没有 jsonb_set 的情况下更新 JSONB

Pie*_*che 7 postgresql performance json postgresql-performance

使用普通的更新语句来更新 json(b) 列是否有任何缺点,如下所示:

update "events" set "properties" = '{"type":"graph"}'
Run Code Online (Sandbox Code Playgroud)

而不是使用 PostgreSQL 提供的 jsonb_set 函数,它会变成这样的语句:

update "events" set jsonb_set("properties", {'type'}, 'graph')
Run Code Online (Sandbox Code Playgroud)

当使用例如。一个 ORM,并在刚刚更新了 JSON 字段的模型上调用 .save(),第一个方法将被调用,但是由于 PostgreSQL 文档中没有提到这种做事方式,我担心这个可能有一些缺点。

鉴于我对数据库性能方面的任何事情都不太熟悉,我想我会来这里问一个问题。

提前致谢!

Vao*_*sun 6

更新:如果 jsonb 的结果值相同,那么唯一的区别是jsonb_set需要额外的 CPU(和毫秒)来运行。在这两种情况下,您都运行SET column = VALUE,但如果结果 jsonb 值不同,则您的两个语句都非常不同,这是示例。

样本:

t=# create table so63(j jsonb);
CREATE TABLE
Time: 6.290 ms
t=# insert into so63 select '{"a":0,"b":true}';
INSERT 0 1
Time: 1.137 ms
Run Code Online (Sandbox Code Playgroud)

jsonb_set

t=# update so63 set j = jsonb_set(j,'{a}','[2,3,4]');
UPDATE 1
Time: 1.699 ms
t=# select j from so63;
              j
-----------------------------
 {"a": [2, 3, 4], "b": true}
(1 row)
Run Code Online (Sandbox Code Playgroud)

jsonb 值在指定路径更改!现在update .. set

Time: 0.278 ms
t=# update so63 set j = '{"a":[2,3,4]}';
UPDATE 1
Time: 0.918 ms
t=# select j from so63;
        j
------------------
 {"a": [2, 3, 4]}
(1 row)

Time: 0.241 ms
Run Code Online (Sandbox Code Playgroud)

整个 jsonb 被覆盖。不仅仅是“a”键