在 RDS 上創建 Postgres 索引比較弱的 linux 主機慢得多
背景:
- 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 快照還原後收集的。顯然,在新恢復後實例變慢是正常的。我以前從未遇到過這個問題,但我從來不需要在還原後立即處理如此龐大的數據集。
在此處查看更多資訊: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 卷,您的附加實例就可以開始訪問該卷及其所有數據。