首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新我们读取的行时,从Postgres读取副本中读取数据的速度较慢

更新我们读取的行时,从Postgres读取副本中读取数据的速度较慢
EN

Stack Overflow用户
提问于 2020-07-26 19:40:57
回答 2查看 220关注 0票数 0

我们在RDS上有一个主Postgres服务器和一个read副本。在过去的几天里,我们不断地写入和更新新的数据。

当查看较旧的数据时,从读取副本读取工作得很好,但当尝试从前几天读取时,我们会一直更新主服务器上的数据,速度非常慢。

查询前一两天的数据,耗时2-3分钟的旧数据查询可能会在20分钟后超时。

查看CPU之类的监视器,我没有看到读取副本上有任何额外的负载。对此有解决方案吗?

EN

回答 2

Stack Overflow用户

发布于 2020-07-27 03:57:10

对于在索引扫描中找到的每1个可见行,您将访问超过65个缓冲区(对于索引扫描返回的每一行,访问超过500个缓冲区,因为90%被mmsi标准过滤掉)。

一个问题是,你的索引并不像它应该的那样有选择性。如果将索引放在(day, mmsi)上,而不仅仅是(day)上,速度应该会快10倍左右。

但看起来你也有大量的肿胀。

你可能没有足够频繁地用吸尘器清理桌子。使用您描述的更新模式,所有的真空需求都累积在最新的数据中,但活动计数器是基于整个表大小进行评估的,因此自动真空的执行频率不足以满足新数据的需求。您可以降低此表的比例因子:

代码语言:javascript
复制
alter table simplified_blips set (autovacuum_vacuum_scale_factor = 0.01)

或者,如果您根据"day“对数据进行分区,那么更新日期的分区自然会更频繁地被清理,因为更新的发生将根据每个分区的大小进行判断,它不会被所有较旧的非活动分区的大小冲淡。此外,每次vacuum运行将占用较少的工作,因为它不必扫描整个表的所有索引,只需扫描活动分区的索引。

票数 1
EN

Stack Overflow用户

发布于 2020-09-22 01:35:16

正如建议的那样,问题是臃肿的。

当您更新ACID数据库中的记录时,数据库将使用更新后的新记录创建该记录的新版本。

在更新之后,你会以一个“死记录”(也就是死元组)结束。

偶尔,数据库会执行自动吸尘器,并从死的元组中清除表。

通常情况下,自动真空应该没问题,但如果您的表真的很大并且经常更新,您应该考虑更改自动真空分析和大小,使其更具侵略性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63099644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档