PostgreSQL的內存結構和調優


PostgreSQL的內存結構

PostgreSQL的內存主要分成兩類:

1.本地內存區域:每個后端進程(backend process)自己使用的

2.共享內存區域:所有進程共同使用

 

本地內存區域

在postgresql中,每個后端進程(backend process)分配一片本地內存用於處理查詢處理;

本地內存又分成子內存區域

(1)work_mem

執行器使用work_mem區域用於對元組的排序,比如order by、distinct操作。也用於表的join操作,比如merge-join、hash-join操作

有參數work_mem控制,默認是4MB。

參數log_temp_files會控制記錄臨時文件名和大小。可以為排序、散列和臨時查詢結果創建臨時文件。如果通過此設置啟用,則在刪除每個臨時文件時將為其發出一個日志條目。當值為0時,記錄所有臨時文件信息;當值為正時,只記錄大小大於或等於指定數據量的文件。如果指定此值時沒有使用單位,則將其作為kb。默認設置是-1,它禁用這樣的日志記錄。只有超級用戶才能更改此設置。

設置建議:

--從較小的值開始

--然后看看日志中的“temporary file”相關信息

--設置成temp文件的2-3倍

(2)maintenance_work_mem

用於一些維護操作。比如vacuum、reindex、alter table add foreign key

由參數maintenance _work_mem控制大小。默認是64MB。由於數據庫會話一次只能執行其中的一個操作,並且PostgreSQL不會同時運行許多操作,因此可以將maintenance_work_mem的值設置為明顯大於work_mem的值。

設置建議:

--RAM*10%,最大不超過1GB

--如果vacuum有問題,可以設置的再大一點。

(3)temp_buffers

存放臨時表。temp_buffer參數控制。默認是8MB。

該參數設置每個數據庫會話使用的臨時緩沖區的最大數量。會話本地緩沖區僅用於訪問臨時表。可以在單個會話中更改此參數的設置,但只能在會話中首次使用臨時表之前更改。

PostgreSQL利用這個內存區域來保存每個會話的臨時表,當連接關閉時,這些臨時表將被清除。

 

共享內存區域

(1)shared buffer

PostgreSQL將表和索引中的頁面從持久存儲加載到共享緩沖池中,然后直接對它們進行操作。

由參數shared_buffers控制,默認是128MB。

(2)wal buffer

存放wal數據

(3)commit log

提交日志(CLOG)保存所有事務的狀態,是並發控制機制的一部分。提交日志分配共享內存,並在整個事務處理過程中使用。

事務有以下四種狀態:

in_progress、commited、aborted、sub-commited

 

其他參數Effective_cache_size。詳見postgresql的effective_cache_size


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM