web-dev-qa-db-fra.com

Mise à jour PostgreSQL JSONB sans jsonb_set

Y aurait-il des inconvénients à utiliser une instruction de mise à jour normale pour mettre à jour une colonne json (b) comme suit:

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

Au lieu d'utiliser la fonction jsonb_set fournie par PostgreSQL, qui se transformerait en cette déclaration:

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

Lors de l'utilisation par exemple. un ORM, et en appelant .save () sur un modèle pour lequel vous venez de mettre à jour un champ JSON, la première méthode sera appelée, mais comme il n'y a aucune mention de cette façon de faire dans la documentation PostgreSQL, je le crains peut présenter certains inconvénients.

Étant donné que je ne suis pas incroyablement familier avec quoi que ce soit concernant les performances dans les bases de données, j'ai pensé venir poser une question ici.

Merci d'avance!

Mise à jour : Si la valeur de résultat de jsonb est la même, alors la seule différence est jsonb_set nécessiterait du CPU (et des ms) supplémentaires pour s'exécuter. Dans les deux cas, vous exécutez SET column = VALUE, mais si la valeur jsonb résultante est différente, vos deux déclarations sont très différentes, voici un exemple.

échantillon:

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)

la valeur jsonb a changé au chemin spécifié! Et maintenant avec 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 entier est écrasé. pas seulement une touche "a"

4
Vao Tsun