web-dev-qa-db-ja.com

PostgreSQLはjsonb_setなしでJSONBを更新します

通常の更新ステートメントを使用してjson(b)列を更新することには、次のような欠点があります。

update "events" set "properties" = '{"type":"graph"}'

PostgreSQLが提供するjsonb_set関数を使用する代わりに、次のステートメントになります。

update "events" set jsonb_set("properties", {'type'}, 'graph')

例えばを使用する場合。 ORM、およびJSONフィールドを更新したばかりのモデルで.save()を呼び出すと、最初のメソッドが呼び出されますが、PostgreSQLのドキュメントでこの方法を実行する方法については言及されていないため、これを恐れていますいくつかの欠点があるかもしれません。

データベースのパフォーマンスについてはあまり詳しくないので、ここに来て質問したいと思いました。

前もって感謝します!

Update:jsonbの結果値が同じ場合、jsonb_setの違いのみが実行に追加のCPU(およびms)を必要とします。どちらの場合も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

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)

指定されたパスで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

jsonb全体が上書きされます。 「a」キーだけでなく

4
Vao Tsun