Postgresql

在 RDS 上創建 Postgres 索引比較弱的 linux 主機慢得多

  • September 30, 2020

背景:

  • 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 卷,您的附加實例就可以開始訪問該卷及其所有數據。

引用自:https://serverfault.com/questions/1035630