PostgreSQL的內存結構分為兩種不同的類型,它們分別是本地內存和共享內存。它們的關係如下圖所示:
視頻講解如下:
https://www.bilibili.com/video/BV1EBs2zgE5B/?aid=115444912492...
一、 本地內存
PostgreSQL的本地內存是指每個後台進程(backend process)自己使用的內存區域,下面列舉了PostgreSQL中的本地內存以及它們的作用。
- work_mem
使用work_mem區域用於對數據的排序,比如order by、distinct操作,也用於表的join操作,比如merge-join、hash-join操作。該區域的大小由參數work_mem控制,默認值是4MB。
- maintenance_work_mem
該內存區域用於一些維護操作,比如vacuum、reindex、alter table add foreign key等操作。它由參數maintenance_work_mem控制大小,默認值是64MB。由於數據庫會話一次只能執行其中的一個操作,並且PostgreSQL不會同時運行許多操作,因此可以將maintenance_work_mem的值設置為明顯大於work_mem的值。
- temp_buffers
該區域存放臨時表的數據,由temp_buffer參數控制,默認值是8MB。該參數設置每個數據庫會話使用的臨時緩衝區的最大數量。PostgreSQL允許在單個會話中更改此參數的設置,但只能在會話中首次使用臨時表之前進行更改。PostgreSQL利用這個內存區域來保存每個會話的臨時表。當連接關閉時,該區域的數據將被自動清除。換句話説,臨時表的數據將被清除。
二、 共享內存
PostgreSQL的共享內存是指每個後台進程(backend process)共同使用的內存區域,下面列舉了PostgreSQL中的共享內存以及它們的作用。
- shared_buffer
PostgreSQL將表和索引中的數據塊從持久存儲加載到共享緩衝池中,然後直接對它們進行操作,從而提高效率。該區域的大小由參數shared_buffers控制,默認值是128MB。
- wal_buffer
存放WAL日誌數據。該區域的大小由參數wal_buffers控制,默認值是4MB。
- effective_cache_size
該區域用於存儲數據庫優化器的相關數據。當前的數據庫服務器可以提供額外的緩存空間時,如:內存的緩存空間、文件系統的緩存空間、CPU的緩存空間等,使用參數effective_cache_size可以控制這些緩存空間的總和。