優化分了三個部分的內容:查詢類,更新類,管理類
查詢類:work_mem參數
該參數是postgresql每個進程可以使用的工作內存空間。如果進程需要的容量超過了這個範圍,就要把處理內容輸出到臨時文件里,相當於OS的swap處理。
查詢時如果用到了排序,哈希關聯,bitmap檢索等方式的話,就要分別利用work_mem的內存空間。也就是一個SQL語句可能會同時使用多個工作內存空間,而不是共用一個。
設置這個參數的時候,就要考慮到同時連接數以及每個連接平均使用的內存空間數。總內存數減去 (同時連接數”平均使用數的總和),剩下的才是OS和postgresql可以利用的緩存。(參考值,不是絕對值) 設置的太大的話,反倒會引起OS的swap,影響性能。
正確設置work_mem的方法如下:
1) psql連接數據庫
2)database=# set client_min_messages=’LOG’;
3) database=# set log_temp_files = 0; //顯示所有使用臨時文件的日誌
4) 執行比較慢的SQL語句
5) 如果顯示了類似下列的日誌的話,就要加大work_mem的值,然後重復第五步
LOG: temporary file: path “base/pgsql_tmp/pgsql_tmp27660.1568″, size 88155700
修改這個參數不用重啓數據庫,reload一下就可以了。
最好先執行一下SQL語句,把需要的資源全部放到緩存里,然後再調試,可以排除IO的影響。
查詢類:work_mem參數
該參數是postgresql每個進程可以使用的工作內存空間。如果進程需要的容量超過了這個範圍,就要把處理內容輸出到臨時文件里,相當於OS的swap處理。
查詢時如果用到了排序,哈希關聯,bitmap檢索等方式的話,就要分別利用work_mem的內存空間。也就是一個SQL語句可能會同時使用多個工作內存空間,而不是共用一個。
設置這個參數的時候,就要考慮到同時連接數以及每個連接平均使用的內存空間數。總內存數減去 (同時連接數”平均使用數的總和),剩下的才是OS和postgresql可以利用的緩存。(參考值,不是絕對值) 設置的太大的話,反倒會引起OS的swap,影響性能。
正確設置work_mem的方法如下:
1) psql連接數據庫
2)database=# set client_min_messages=’LOG’;
3) database=# set log_temp_files = 0; //顯示所有使用臨時文件的日誌
4) 執行比較慢的SQL語句
5) 如果顯示了類似下列的日誌的話,就要加大work_mem的值,然後重復第五步
LOG: temporary file: path “base/pgsql_tmp/pgsql_tmp27660.1568″, size 88155700
修改這個參數不用重啓數據庫,reload一下就可以了。
最好先執行一下SQL語句,把需要的資源全部放到緩存里,然後再調試,可以排除IO的影響。