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。詳見