我有一个关于在一个大约8到10 to大小的大表上更新的性能问题。我有一个任务,我应该从一个大约有430万行的表中检测不同的值,并将它们插入到某个表中。这部分并不是真正的问题,但它是随后的更新。因此,我需要根据我导入的表中创建的行的id来更新一些列。我正在执行的查询的一个示例是:
UPDATE billinglinesstagingaws as s
SET product_id = p.id
FROM product AS p
WHERE p.key=(s.data->'product'->>'sku')::varchar(75)||'-'||(s.data->'lineitem'->>'productcode')::varchar(75) and cloudplatform_id = 1如前所述,临时表的大小约为430万行,大小为8-10 it,从查询中可以看出,它有一个JSONB字段,而product表大约有1500行。这大约需要12分钟,我真的不确定这是否可以,我真的想知道,我可以做些什么来加快速度。没有外键约束,只有两个列的唯一约束。临时表上没有索引。我附加了查询的查询计划,所以任何建议都会很有帮助。提前谢谢。

发布于 2020-12-14 02:51:19
对于评论来说,这有点太长了。
更新表中的430万行将需要一些时间。更新需要时间,因为数据库的ACID属性要求每次更新都要将某些内容提交到磁盘--通常是日志记录。这还不包括读取记录、更新索引和其他开销的时间。
因此,每秒大约17,000次更新并不是那么糟糕。
可能有一些方法可以加快查询速度。但是,您可以将这些描述为新行。这让我想知道在创建表时是否可以只插入正确的值。您是否可以在插入过程中查找适当的值,而不是在以后的update中查找
https://stackoverflow.com/questions/65279335
复制相似问题