Postgresql

Postgres 在副本中的插入性能是否相同

  • May 29, 2021

我們有一個 Postgres 數據庫,其中的表需要大量的選擇、更新和插入,需要一些調整(它有太多的索引)。

我們有一個只讀副本,我想知道在我們整理索引性能時,將所有 SELECT 查詢轉移到副本是否會是一個快速的勝利。(我們的應用程序可以很容易地切換到副本,而對索引進行排序需要更長的時間)。

我的理解是,在這種情況下,將讀取操作指向副本可能不會提高性能,但想檢查一下我的理解。

我的理解是:

  1. INSERT 和 UPDATE 操作將在它們送出到記憶體後返回(然後非同步寫入 WAL),因此它們不會快多少。
  2. 副本將流式傳輸 WAL,並且必須更新它自己的表和索引副本。因此,副本上的 SELECT 操作將不得不與這些更新強加給主副本的相同 IO 和 CPU 需求相抗衡,因此不會獲得任何性能。

如果我們的應用程序只是流式插入,那麼我可以看到插入的性能改進,但在實踐中,由於客戶端一起執行 SELECT/INSERT,在這個案例中我看不到真正的性能提升?

這是正確的,還是我錯過了什麼?

我的理解是:

INSERT 和 UPDATE 操作將在它們送出到記憶體後返回(然後非同步寫入 WAL),因此它們不會快多少。

這聽起來像是對 sychronous_commit=off 的描述,但這不是該設置的預設值,而且您沒有描述已更改它。

在任何情況下,修改都可能涉及計算和查詢任何數量的行,而不是被修改的行。必須與並發大量選擇共享 CPU 和磁碟肯定會相互減慢修改速度。如果您的所有更新都只是通過 pk 並將列設置為文字,並且您的所有插入都只是文字列表,並且您沒有 fk 約束,那麼也許這不是問題。

副本將流式傳輸 WAL,並且必須更新它自己的表和索引副本。因此,副本上的 SELECT 操作將不得不與這些更新強加給主副本的相同 IO 和 CPU 需求相抗衡,因此不會獲得任何性能。

重播 WAL 可能比生成它的 IO 少。副本不必驗證 fk 約束。如果更新是 HOT(僅堆元組),則副本不需要查詢任何索引,而原始工作可能必須至少查詢一個索引才能辨識要更新的元組。並且副本不需要對主要考慮但在修改之前過濾掉的元組做任何事情。

準確預測通過重定向讀取可以獲得多少好處可能至少與優化索引一樣困難。

可以提高您的INSERT操作性能(從而提高應用程序中發生這些操作的性能),具體取決於您的只讀副本的設置方式以及INSERT爭用是否部分是由於對主數據庫的大量讀取引起的鎖定。

在實踐中,我不是 PostgreSQL副本方面的專家,但該理論是適用的,如果您的只讀副本與主數據庫非同步同步,那麼在您的只讀副本SELECT上執行的任何查詢都不應導致鎖定您的主數據庫(就像他們如果它們在主節點上執行,通常會這樣)。如果它正在流式傳輸正在非同步寫入的 WAL,那麼聽起來它是非同步同步的。如果是這種情況,並且如果您的數據庫遇到嚴重的讀爭用,您可能會通過將查詢移至INSERT``SELECT讀取副本

SELECT查詢的性能而言,我相信您可能是正確的,您不一定會看到任何性能提升,因為它們仍然會受到相同的 CPU、I/O 和寫爭用的約束只讀副本已更新。

如果它很容易測試,我會說它值得一試,如果你沒有什麼可失去的。

引用自:https://dba.stackexchange.com/questions/292453