背景:
- Postgres 10.9
- DB 在开发主机上作为 docker 容器运行。(t3.large,gp2 500GB 存储空间)
- DB 在 RDS 中运行,用于暂存和生产。(m5.2xlarge,gp2 1TB 存储)
一切都很好,很长一段时间都是这样,而且我的 db alter 时间似乎总是在 prod/staging 与 dev 中更快(如预期的那样)。
问题/问题:
我有一个特定的索引创建,它在 RDS(更强大)中比在本地开发主机上花费的时间长 20 倍。我在过去几年中看到的所有其他案例,RDS 主机都更快,因为它具有更强的计算能力和更高的 I/O 速度。
- 实例之间的数据和模式是相同的。使用 pg_dump + pg_restore 每晚用新数据加载开发数据库。
- 与我数据库中的其他表相比,该表相对较大(3000 万行)(大多小于 100 万行)
这是一个简单的索引操作:
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 = ##);
但似乎没有任何区别的东西。
任何帮助表示赞赏
以下是根本原因的摘要:
时间是在 RDS 快照还原后收集的。显然,在新恢复后实例变慢是正常的。我以前从未遇到过这个问题,但我从来不需要在还原后立即处理如此庞大的数据集。
就我而言,我只是为有问题的表进行了全表选择,以从初始还原中“预拉”数据。然后我运行了创建索引,它很快就完成了。
因此,总而言之,RDS 快照还原在全新还原后会出现性能下降。
更多信息:https ://cintia.me/blog/post/lazy-rds/