我们在RDS上有一个主Postgres服务器和一个read副本。在过去的几天里,我们不断地写入和更新新的数据。
当查看较旧的数据时,从读取副本读取工作得很好,但当尝试从前几天读取时,我们会一直更新主服务器上的数据,速度非常慢。
查询前一两天的数据,耗时2-3分钟的旧数据查询可能会在20分钟后超时。
查看CPU之类的监视器,我没有看到读取副本上有任何额外的负载。对此有解决方案吗?
发布于 2020-07-27 03:57:10
对于在索引扫描中找到的每1个可见行,您将访问超过65个缓冲区(对于索引扫描返回的每一行,访问超过500个缓冲区,因为90%被mmsi标准过滤掉)。
一个问题是,你的索引并不像它应该的那样有选择性。如果将索引放在(day, mmsi)上,而不仅仅是(day)上,速度应该会快10倍左右。
但看起来你也有大量的肿胀。
你可能没有足够频繁地用吸尘器清理桌子。使用您描述的更新模式,所有的真空需求都累积在最新的数据中,但活动计数器是基于整个表大小进行评估的,因此自动真空的执行频率不足以满足新数据的需求。您可以降低此表的比例因子:
alter table simplified_blips set (autovacuum_vacuum_scale_factor = 0.01)或者,如果您根据"day“对数据进行分区,那么更新日期的分区自然会更频繁地被清理,因为更新的发生将根据每个分区的大小进行判断,它不会被所有较旧的非活动分区的大小冲淡。此外,每次vacuum运行将占用较少的工作,因为它不必扫描整个表的所有索引,只需扫描活动分区的索引。
发布于 2020-09-22 01:35:16
正如建议的那样,问题是臃肿的。
当您更新ACID数据库中的记录时,数据库将使用更新后的新记录创建该记录的新版本。
在更新之后,你会以一个“死记录”(也就是死元组)结束。
偶尔,数据库会执行自动吸尘器,并从死的元组中清除表。
通常情况下,自动真空应该没问题,但如果您的表真的很大并且经常更新,您应该考虑更改自动真空分析和大小,使其更具侵略性。
https://stackoverflow.com/questions/63099644
复制相似问题