sql - Postgres 从 JSONB 更新 INTEGER 列
问题描述
我有一张桌子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 行需要相当多的时间,而且在我看来,查询中有很多冗余。
我认为下一步是将所有这些包装在事务中并改进查询,有什么可以做的来提高这个查询的性能吗?
解决方案
尝试不使用子查询。
update cart as c
set value = coalesce((c.metadata->>'value')::int, 0)
推荐阅读
- python - 通过 python SDK 将用户分配给 Azure Active Directory 企业应用程序
- rxjs - Observable 多次发出请求并一起收集响应
- html - CSS 网格 - 如何居中
- mysql - 在 WHERE 子句中使用子查询,但每个子查询结果限制为一个匹配项
- python-3.x - 带有 pil 图像的 tkinter 的奇怪行为
- javascript - 无法在反应类中声明常量
- python - Python单线程比CPU绑定中的两个线程慢
- javascript - 带有文本输入的自定义对话框 React Native
- spring-boot - 在 Gradle Spring Boot 项目中的 wsdl2Java 任务中将正确的路径传递给本地 WSDL 文件
- c++ - 读取数据包时出现FFMPEG c++内存泄漏问题