【发布时间】:2021-07-28 01:11:00
【问题描述】:
我有近 200 万条记录需要对类似此部分记录的标识符数组中的值进行简单的字符串替换
{
"id": "a851375d-f6a0-4fba-ba69-c584901de73c",
"source": "MARC",
"title": "Voice Content and Usability [electronic resource] / So, Preston.",
"identifiers": [
{
"value": "9781952616020",
"identifierTypeId": "fcca2643-406a-482a-b760-7a7f8aec640e"
},
{
"value": "(CaSebORM)9781098128852",
"identifierTypeId": "7e591197-f335-4afb-bc6d-a6d76ca3bace"
},
{
"value": "5429852",
"identifierTypeId": "d5989db8-ddc3-4f06-a465-73e99ec262d3"
},
{
"value": "ocm00000001saf9781098128852",
"identifierTypeId": "7e591197-f335-4afb-bc6d-a6d76ca3bace"
}
]
}
我需要从最终值中检测并删除“ocm0000000”,并且我正在寻找最有效的方法。当我尝试简单地将 jsonb 转换为字符串时,请进行简单的字符串替换,例如
update my.table
set jsonb = REPLACE(jsonb::text, 'ocm0000000', '')::jsonb
它占用了 CPU 并占用了我们 RDS 集群的所有连接,从而干扰了其他操作,因此必须终止该进程。
当有这么多行受到影响时,进行这种替换的最佳方法是什么?
【问题讨论】:
-
“接受了所有的连接” 这不是一个可信的说法。 UPDATE 语句不会自发产生新的连接。 (目前,他们甚至不使用并行化)。您在监控中看到什么让您产生这种想法?
-
数据库管理员联系我告诉我。当我查看监控时,我看到持续的大约 30 IOPS 到 > 50,000 IOPS 的峰值,并且系统中其他用户的其他事务没有通过——大概是那些挂起的连接。当我杀死我的 PID 时,发生了其他事务,IOP 恢复正常,事情和以前一样。无论如何,我想知道解决此类数据问题的最佳方法是什么。
标签: postgresql jsonb