在 RDS 上创建 Postgres 索引比性能较弱的 Linux 主机慢得多

在 RDS 上创建 Postgres 索引比性能较弱的 Linux 主机慢得多

背景:

  • Postgres 10.9
  • DB 作为 docker 容器在开发主机上运行。(t3.large,gp2 500GB 存储)
  • DB 在 RDS 中运行以进行暂存和生产。(m5.2xlarge,gp2 1TB 存储)

一切都很好,已经这样很长时间了,我的数据库修改时间似乎总是与开发相比,在生产/准备阶段速度更快(正如预期的那样)。

問題/問題:

我有一个特定的索引创建,它在 RDS(功能更强大)中花费的时间比在本地开发主机上花费的时间长 20 倍。在过去几年中我看到的所有其他案例中,RDS 主机都更快,因为它具有更强大的计算能力和更高的 I/O 速度。

  • 实例之间的数据和架构相同。每晚使用 pg_dump + pg_restore 将新数据加载到开发数据库中。
  • 与我的数据库中的其他表(大多数小于 100 万行)相比,该表相对较大(3000 万行)

这是一个简单的索引操作:

CREATE INDEX idx_email_records_created ON email_records(created_at);

在本地 Linux 开发环境中:

db=> CREATE INDEX idx_email_records_created ON email_records(created_at);
CREATE INDEX
Time: 68523.557 ms (01:08.524)

在 RDS 主机上:

db=> CREATE INDEX idx_email_records_created ON email_records(created_at);
CREATE INDEX
Time: 1490902.929 ms (24:50.903)

我检查了所有正常的东西:CPU 负载(在所有情况下都有足够的空闲空间)、内存(在所有情况下都有足够的空闲空间)。锁定/表使用情况等。

开发主机每晚都会使用 prod db 的新克隆进行恢复,因此行数没有差异。

我已经检查过 max_parallel 并尝试过类似的东西,ALTER TABLE email_records SET (parallel_workers = ##);但似乎没有什么区别。

任何帮助表示感谢

答案1

以下是根本原因的总结:

时间是在 RDS 快照恢复后收集的。显然,实例在全新恢复后变慢是正常的。我以前从未遇到过这个问题,但我以前从未需要在恢复后立即处理如此庞大的数据集。

更多详情请见:https://stackoverflow.com/questions/47545414/aws-rds-instance-created-from-snapshot-very-slow

就我而言,我刚刚选择了整个表格让有问题的表“预先拉取”初始恢复中的数据。然后我运行创建索引并它很快就结束了

因此,总而言之,RDS 快照恢复在全新恢复后将出现性能低迷。

更多信息:https://cintia.me/blog/post/lazy-rds/

从现有 EBS 快照创建的新卷会在后台延迟加载。这意味着,从快照创建卷后,无需等待所有数据从 Amazon S3 传输到 EBS 卷,然后附加的实例就可以开始访问卷及其所有数据。

相关内容