PostgreSQL 配置記憶體引數
對於任何資料庫軟體,記憶體配置項都是很重要的配置項。在 PostgreSQL 主要有以下幾個記憶體配置引數。
shared_buffers: integer 型別,設定資料庫伺服器將使用的共享記憶體緩衝區數量,此緩衝區為緩衝資料塊所用。此緩衝區是放在共享記憶體中的。每個緩衝區大小的典型值是 8K 位元組,預設值通常是 4000,對於 8KB 的資料塊則共享記憶體緩衝區大小為 400*8KB=32MB。這個數值必須大於 16,並且至少是 max_connections 數值的兩倍。通常都會把此值設定的大一些,這樣可以改進效能。一般設定為實體記憶體的 25%,若把 shared_buffers 設定的更大,如超過實體記憶體的 40%,就會發現緩衝的效果並不明顯了,這是因為 PostgreSQL 是執行檔案系統之上的,若檔案系統也有快取,將導致雙快取過多,造成負面影響。
temp_buffers: integer 型別,設定每個資料庫會話使用的臨時緩衝區的最大數目。此本地緩衝區只用於訪問臨時表。臨時緩衝區是在某個連線會話的服務程序中分配的,屬於本地記憶體。臨時緩衝區的大小也是按資料塊大小分配的,預設是 1000,對於 8K 的資料塊大小為 8MB。
work_mem: integer 型別,宣告內部排序操作和 Hash 表在開始使用臨時磁碟檔案之前可使用的記憶體數目。這個記憶體也是本地記憶體,預設是 1MB。請注意對於複雜的查詢,可能會同時併發執行好幾個排序或雜湊(hash)操作;每個排序或雜湊操作都會分配這個引數宣告的記憶體來儲存中間資料,只有存不下才會使用臨時檔案。同樣,好幾個正在執行的會話可能會同時進行排序操作,因此使用的總記憶體量可能是 work_mem 的好幾倍。 ORDER BY、DISTINCT 和 MERGE JOINS 都要用到排序操作。Hash 表在以 Hash join、Hash 為基礎的聚集、以 Hash 為基礎的 IN 子查詢處理中都要用到。
maintenance_work_mem: integer 型別,宣告在維護性操作(比如 CACUUM、CREATE INDEX、ALTER TABLE ADD FOREIGN KEY等)中使用的最大記憶體數。預設是 16 MB。在一個數據庫會話裡,只有一個這樣的操作可以執行行,並且一個數據庫例項通常不會有太多這樣的工作併發執行,把這個數值設定得比 work_mem 大一些通常是合適的。更大的設定可以提高上述操作的速度。
max_stack_depth: integer 型別,宣告伺服器執行堆疊的最大安全深度。預設值 2MB。如果發現不能運行復雜的函式,可以適當提高此配置的值,不過通常情況下保持預設值就夠了。
把 max_stack_depth 引數設定得大於實際的作業系統核心限制值時,意味著一個正在執行的遞迴函式可能會導致 PostgreSQL 後臺服務程序奔潰。在一些作業系統平臺上,PG 能夠檢測出核心限制,這時它將不允許將其設定為一個不安全的值。但PG並不能在所有作業系統的平臺都檢測它的限制值,所以還是建議設定一個明確的值。
總結:
shared_buffers:共享記憶體的大小,主要用於共享記憶體資料塊。
work_mem:單個 SQL 執行時,排序、hash join 所使用的記憶體,SQL 執行完成後,記憶體就釋放了。
shared_buffers 預設值為 32 MB,work_mem 為 1MB,如果你的機器上有足夠的記憶體,可以把這個引數改得大一些,
這樣資料庫就可以快取更多的資料塊,當讀取資料時,就可以從共享記憶體中讀,而不需要再從檔案上去讀取。
work_mem 設定大一些,會讓排序操作快一些。