Postgres обновляет столбец INTEGER из JSONB

У меня есть таблица cart:

 id     | value |     metadata
--------+-------+-------------------
  45417 |     0 | {"value": "1300"}
  45418 |     0 | {"value": "1300"}
 276021 |     0 | {"value": "1300"}

и я пытаюсь ОБНОВИТЬ столбец value значением в JSONB metadata, если он существует. Я пришел к следующему запросу:

UPDATE cart SET value=CAST(subquery.meta_val as INTEGER) FROM
(SELECT id, metadata->>'value' as meta_val FROM cart
WHERE value = 0 AND 
metadata->>'value' IS NOT NULL) as subquery
WHERE cart.id=subquery.id;

Теперь это работает, но для 4M строк, которые я хочу обновить при производстве, требуется довольно много времени, и мне кажется, что в запросе много избыточности.

Я думаю, что следующим шагом было бы обернуть все это в транзакцию и улучшить запрос. Можно ли что-нибудь сделать для повышения производительности этого запроса?


person PepperoniPizza    schedule 27.03.2019    source источник


Ответы (1)


Попробуйте без подзапроса.

update cart as c
set value = coalesce((c.metadata->>'value')::int, 0)
person Rob Taylor    schedule 27.03.2019
comment
Или, если вы хотите оставить значение без изменений, тогда вместо 0 просто используйте c.value - person Rob Taylor; 27.03.2019