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:共享內存的大小,主要用於共享內存數據塊。spa

work_mem:單個 SQL 執行時,排序、hash join 所使用的內存,SQL 運行完成後,內存就釋放了。操作系統

 

shared_buffers 默認值爲 32 MB,work_mem 爲 1MB,若是你的機器上有足夠的內存,能夠把這個參數改得大一些,排序

這樣數據庫就能夠緩存更多的數據塊,當讀取數據時,就能夠從共享內存中讀,而不須要再從文件上去讀取。

 

work_mem 設置大一些,會讓排序操做快一些。

相關文章
相關標籤/搜索