PostgreSQL 参数修改最佳实践

数据库关系型数据库技术服务知识库
前言

在 PostgreSQL 中,对于参数的生效时机有如下几种类型:

  1. postmaster:需要重启数据库才可以生效。
  2. superuser-backend:该类型的参数可以由超级用户来改变,可以在 postgresql.conf 中对这些设置进行更改,而无需重新启动 PostgreSQL 实例,只对新连接生效。
  3. user:不需要重启数据库,通过 set 命令即可设置。
  4. internal:只读参数,无法通过配置文件进行修改。
  5. backend :不需要重启数据库,给 postmaster 进程发送 sighup 信号即可生效,只对新连接生效。
  6. sighup:不需要重启数据库,给 postmaster 进程发送 sighup 信号即可生效。与 beckend 区别在于发送 sighup 之后,新的参数值会应用到现有的连接。
  7. superuser :不需要重启数据库,超级用户通过 set 命令即可设置。

可以通过如下命令来查看参数的生效的方式:

postgres=# select distinct(context) from pg_settings;
用户场景

用户想设置参数 max_parallel_workers 和 max_parallel_workers_per_gather 来改善特定分析场景下,特定应用程序的查询效率,但是不想全局生效,该如何设置?

postgres=# select name,setting,context from pg_settings where name in ('max_parallel_workers','max_parallel_workers_per_gather');
              name               | setting | context 
---------------------------------+---------+---------
 max_parallel_workers            | 8       | user
 max_parallel_workers_per_gather | 2       | user
(2 rows)

查看到这两个参数均可以在 session级别来进行设置,设置的方式有如下三种:

通过 session 设置

postgres=# set max_parallel_workers = 4;
SET
postgres=# set max_parallel_workers_per_gather = 4;
SET

通过 PGOPTIONS 环境变量设置

[postgres@rudonx ~]$ export PGOPTIONS='-c max_parallel_workers_per_gather=4 -c max_parallel_workers=8'
postgres=# select name,setting,context from pg_settings where name in ('max_parallel_workers','max_parallel_workers_per_gather');
              name               | setting | context 
---------------------------------+---------+---------
 max_parallel_workers            | 8       | user
 max_parallel_workers_per_gather | 4       | user
(2 rows)

通过连接串指定

如果是 psql 客户端,可以使用如下方式进行设置:

psql "host=dbhost port=dbport dbname=dbname user=dbuser password=dbpassword options='-c max_parallel_workers_per_gather=4 -c max_parallel_workers=8' "

或者可以使用下面的这种形式

psql postgresql://dbuser@dbhost:dbport/dbname?options=-c%20max_parallel_workers_per_gather%3D4%20-c%20max_parallel_workers%3D8

如果使用的是 jdbc,如下指定连接串即可:

Properties props = new Properties();
props.setProperty("options", "-c max_parallel_workers_per_gather=4 -c max_parallel_workers=8");
Connection conn = DriverManager.getConnection(url, props);
或者使用如下形式:
String url = "jdbc:postgresql://dbuser@dbhost:dbport/dbname?options=-c%20max_parallel_workers_per_gather=4%20-c%20max_parallel_workers=8";
Connection conn = DriverManager.getConnection(url);
0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论