我有一张桌子cart
:
id | value | metadata
--------+-------+-------------------
45417 | 0 | {"value": "1300"}
45418 | 0 | {"value": "1300"}
276021 | 0 | {"value": "1300"}
,并且我尝试使用JSONB value
中的值更新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行需要花费大量时间,在我看来查询中有很多冗余。
我认为下一步是将所有这些内容包装在事务中并改进查询,是否可以做些事情来提高此查询的性能?
答案 0 :(得分:1)
尝试不带子查询。
update cart as c
set value = coalesce((c.metadata->>'value')::int, 0)