Postgres обновить столбец INTEGER из JSONB - PullRequest
0 голосов
/ 27 марта 2019

У меня есть таблица 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, которые я хочу обновить в производственной среде, это занимает довольно много времени, и мне кажется, что существует большая избыточность взапрос.

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

1 Ответ

1 голос
/ 27 марта 2019

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

update cart as c
set value = coalesce((c.metadata->>'value')::int, 0)
...