背景:
- 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 卷,然后附加的实例就可以开始访问卷及其所有数据。