1. 程式人生 > 其它 >pg資料庫效能優化(轉)

pg資料庫效能優化(轉)

引數修改的方式

1.修改配置檔案

在配置檔案data目錄下postgresql.conf 中直接修改,修改前記得備份一下原檔案。修改完成之後,記得重啟資料庫哦。

2.命令列的修改方式

  ALTER SYSTEM SET configuration_parameter { TO | = } { value | 'value' | DEFAULT }

例如:我們現在要修改 maintenance_work_mem引數

show all;
show maintenance_work_mem;
ALTER SYSTEM SET maintenance_work_mem= 1048576; show maintenance_work_mem;
--注意這裡的設定不會改變postgresql.conf,只會改變postgresql.conf

修改引數表

引數詳解

1.shared_buffers

PostgreSQL既使用自身的緩衝區,也使用核心緩衝IO。這意味著資料會在記憶體中儲存兩次,首先是存入PostgreSQL緩衝區,然後是核心緩衝區。這被稱為雙重緩衝區處理。對大多數作業系統來說,這個引數是最有效的用於調優的引數。此引數的作用是設定PostgreSQL中用於快取的專用記憶體量。
shared_buffers的預設值設定得非常低,因為某些機器和作業系統不支援使用更高的值。但在大多數現代裝置中,通常需要增大此引數的值才能獲得最佳效能。
建議的設定值為機器總記憶體大小的25%,但是也可以根據實際情況嘗試設定更低和更高的值。實際值取決於機器的具體配置和工作的資料量大小。舉個例子,如果工作資料集可以很容易地放入記憶體中,那麼可以增加shared_buffers的值來包含整個資料庫,以便整個工作資料集可以保留在快取中。
在生產環境中,將shared_buffers設定為較大的值通常可以提供非常好的效能,但應當時刻注意找到平衡點。
檢視當前shared_buffers的值:

postgres=# show shared_buffers;
shared_buffers
----------------
128MB
(1 row)


2.wal_buffers

PostgreSQL將其WAL(預寫日誌)記錄寫入緩衝區,然後將這些緩衝區重新整理到磁碟。由wal_buffers定義的緩衝區的預設大小為16MB,但如果有大量併發連線的話,則設定為一個較高的值可以提供更好的效能。
檢視當前wal_buffers的值:

postgres=# show wal_buffers;
wal_buffers
-------------
4MB
(1 row)


3.effective_cache_size

effective_cache_size提供可用於磁碟快取記憶體的記憶體量的估計值。它只是一個建議值,而不是確切分配的記憶體或快取大小。它不會實際分配記憶體,而是會告知優化器核心中可用的快取量。在一個索引的代價估計中,更高的數值會使得索引掃描更可能被使用,更低的數值會使得順序掃描更可能被使用。在設定這個引數時,還應該考慮PostgreSQL的共享緩衝區以及將被用於PostgreSQL資料檔案的核心磁碟緩衝區。預設值是4GB。
檢視當前effective_cache_size的值:

postgres=# show effective_cache_size;
effective_cache_size
----------------------
4GB
(1 row)


4.work_mem

此配置用於複合排序。記憶體中的排序比溢位到磁碟的排序快得多,設定非常高的值可能會導致部署環境出現記憶體瓶頸,因為此引數是按使用者排序操作。如果有多個使用者嘗試執行排序操作,則系統將為所有使用者分配大小為work_mem *總排序運算元的空間。全域性設定此引數可能會導致記憶體使用率過高,因此強烈建議在會話級別修改此引數值。預設值為4MB。
檢視當前work_mem的值:

postgres=# show work_mem;
work_mem
----------
4MB
(1 row)


5.maintenance_work_mem

maintenance_work_mem是用於維護任務的記憶體設定。預設值為64MB。設定較大的值對於VACUUM,RESTORE,CREATE INDEX,ADD FOREIGN KEY和ALTER TABLE等操作的效能提升效果顯著。
檢視當前maintenance_work_mem的值:

postgres=# show maintenance_work_mem;
maintenance_work_mem
----------------------
64MB
(1 row)


6.synchronous_commit

此引數的作用為在向客戶端返回成功狀態之前,強制提交等待WAL被寫入磁碟。這是效能和可靠性之間的權衡。如果應用程式被設計為效能比可靠性更重要,那麼關閉synchronous_commit。這意味著成功狀態與保證寫入磁碟之間會存在時間差。在伺服器崩潰的情況下,即使客戶端在提交時收到成功訊息,資料也可能丟失。
檢視當前synchronous_commit的設定值:

postgres=# show synchronous_commit;
synchronous_commit
--------------------
on
(1 row)


7.checkpoint_timeout和checkpoint_completion_target

PostgreSQL將更改寫入WAL。檢查點程序將資料重新整理到資料檔案中。發生CHECKPOINT時完成此操作。這是一項開銷很大的操作,整個過程涉及大量的磁碟讀/寫操作。使用者可以在需要時隨時發出CHECKPOINT指令,或者通過PostgreSQL的引數checkpoint_timeout和checkpoint_completion_target來自動完成。
checkpoint_timeout引數用於設定WAL檢查點之間的時間。將此設定得太低會減少崩潰恢復時間,因為更多資料會寫入磁碟,但由於每個檢查點都會佔用系統資源,因此也會損害效能。此引數只能在postgresql.conf檔案中或在伺服器命令列上設定。
checkpoint_completion_target指定檢查點完成的目標,作為檢查點之間總時間的一部分。預設值是 0.5。 這個引數只能在postgresql.conf檔案中或在伺服器命令列上設定。高頻率的檢查點可能會影響效能。
檢視當前checkpoint_timeout和checkpoint_completion_target的值:

postgres=# show checkpoint_timeout;
checkpoint_timeout
--------------------
5min
(1 row)

postgres=# show checkpoint_completion_target;
checkpoint_completion_target
------------------------------
0.5
(1 row)

注意:

並非所有引數都適用於所有應用程式型別。某些應用程式通過調整引數可以提高效能,有些則不會。必須針對應用程式及作業系統的特定需求來調整資料庫引數。