Skip to content

https://www.jianshu.com/p/ffee8939e2ed

https://blog.csdn.net/qq276726581/article/details/72843773

https://www.cnblogs.com/ryanzheng/p/9874230.html

https://www.modb.pro/db/28959

1.share_buffers

四个设置对系统性能有着全局性的影响,建议你在实际环境下通过实测来找到最优值

share_buffers

于缓存最近访问过的数据页的内存区大小,所有用户会话均可共享此缓存区

一般来说越大越好,至少应该达到系统总内存的25%,但不宜超过8GB,因为超过后会出现“边际收益递减”效应。

需重启postgreSQL服务

2.effective_cache_size

一个查询执行过程中可以使用的最大缓存,包括操作系统使用的部分以及PostgreSQL使用部分,系统并不会根据这个值来真实地分配这么多内存,但是规划器会根据这个值来判断系统能否提供查询执行过程中所需的内存。如果将此设置设得过小,远远小于系统真实可用内存量,那么可能会给规划器造成误导,让规划器认为系统可用内存有限,从而选择不使用索引而是走全表扫描(因为使用索引虽然速度快,但需要占用更多的中间内存)。

在一台专用于运行PostgreSQL数据库服务的服务器上,建议将effective_cache_size的值设为系统总内存的一半或者更多。

此设置可动态生效,执行重新加载即可

3.work_mem

此设置指定了用于执行排序,哈希关联,表扫描等操作的最大内存量。

此设置可动态生效,执行重新加载即可

4.mintenance_work_mem

此设置指定可用于vaccum操作(即清空已标记为“被删除”状态的记录)这类系统内部维护操作的内存总量。

其值不应大于1GB

此设置可动态生效,执行重新加载即可

修改参数命令

bash
postgres=# alter system set work_mem=8192;
ALTER SYSTEM

设置重新加载命令
postgres=#select pg_reload_conf();
postgres=# alter system set work_mem=8192;
ALTER SYSTEM

设置重新加载命令
postgres=#select pg_reload_conf();

5,vacuum监控和调优

5.1 监控

5.1.1dead tuple

sql
-- 死行的存在会导致表持续膨胀,相应的查询也会变慢,所以需要持续关注表中dead tuple的状况
postgres@postgres=> select relname,n_dead_tup,n_live_tup from pg_stat_user_tables;
 relname | n_dead_tup | n_live_tup 
---------+------------+------------
 job     |          3 |          0
 emp1    |          0 |          7
(2 rows)

postgres@postgres=>select relname,coalesce(round(n_dead_tup * 100 / (case when n_live_tup + n_dead_tup = 0 then null else n_live_tup + n_dead_tup end ),2),0.00) as dead_tup_ratio from pg_stat_user_tables order by dead_tup_ratio desc limit 5;
 relname | dead_tup_ratio 
---------+----------------
 job     |         100.00
 emp1    |           0.00
(2 rows)
-- 死行的存在会导致表持续膨胀,相应的查询也会变慢,所以需要持续关注表中dead tuple的状况
postgres@postgres=> select relname,n_dead_tup,n_live_tup from pg_stat_user_tables;
 relname | n_dead_tup | n_live_tup 
---------+------------+------------
 job     |          3 |          0
 emp1    |          0 |          7
(2 rows)

postgres@postgres=>select relname,coalesce(round(n_dead_tup * 100 / (case when n_live_tup + n_dead_tup = 0 then null else n_live_tup + n_dead_tup end ),2),0.00) as dead_tup_ratio from pg_stat_user_tables order by dead_tup_ratio desc limit 5;
 relname | dead_tup_ratio 
---------+----------------
 job     |         100.00
 emp1    |           0.00
(2 rows)

5.1.2tuple的空间

sql
postgres@postgres=>select relname,relpages / reltuples as per_tuple_page from pg_class where reltuples!=0;
                    relname                    |    per_tuple_page     
-----------------------------------------------+-----------------------
 jobid_seq                                     |                     1
 pg_statistic                                  |  0.045023696682464455
 pg_type                                       |  0.024630541871921183
 pg_toast_2618                                 |    0.2289156626506024
 pg_toast_2618_index                           |  0.008032128514056224
 pg_toast_2619                                 |   0.23076923076923078
.......


postgres@postgres=>select relname,reltuples / relpages as per_page_tuple from pg_class where reltuples!=0;
                    relname                    |   per_page_tuple   
-----------------------------------------------+--------------------
 jobid_seq                                     |                  1
 pg_statistic                                  | 22.210526315789473
 pg_type                                       |               40.6
 pg_toast_2618                                 |  4.368421052631579
postgres@postgres=>select relname,relpages / reltuples as per_tuple_page from pg_class where reltuples!=0;
                    relname                    |    per_tuple_page     
-----------------------------------------------+-----------------------
 jobid_seq                                     |                     1
 pg_statistic                                  |  0.045023696682464455
 pg_type                                       |  0.024630541871921183
 pg_toast_2618                                 |    0.2289156626506024
 pg_toast_2618_index                           |  0.008032128514056224
 pg_toast_2619                                 |   0.23076923076923078
.......


postgres@postgres=>select relname,reltuples / relpages as per_page_tuple from pg_class where reltuples!=0;
                    relname                    |   per_page_tuple   
-----------------------------------------------+--------------------
 jobid_seq                                     |                  1
 pg_statistic                                  | 22.210526315789473
 pg_type                                       |               40.6
 pg_toast_2618                                 |  4.368421052631579

5.1.3pgstattuple

pgstattuple模块提供了各种功能来获取元组级别的统计信息。

参考https://www.PostgreSQL.org/docs/current/pgstattuple.html

https://www.modb.pro/db/26061