有一堆配置参数可以用这样那样的方法影响数据库系统的行为. 我们在这里描述一下如何设置它们,然后在下一章我们将逐个 讨论它们.
所有参数名都是大小写不敏感的.每个参数都可以接受下面描述的布尔,整数, 浮点数,字符串四种类型之一.布尔值可以是 ON,OFF, TRUE,FALSE, YES,NO, 1,0 (大小写无关)或这些东西的任意清晰无 歧义的前缀.
设置这些选项的一个方法是在数据目录里(比如 /usr/local/pgsql/data) 创建一个文件 postgresql.conf 比如,下面是一个例子:
# This is a comment log_connections = yes syslog = 2象你看到的那样,选项是每条一行.选项名和值之间的等号是可选的. 空白和空行被忽略.井号(“#”)用做任何地方 引入注释.
每次 postmaster 收到 SIGHUP 信号后都会重新读取这个配置文件. 这个信号同样也广播给所有正在运行的后端进程,所以正在运行 的会话得到新的缺省.另外,你可以只向一个后端进程直接发送信号.
第二种设置这些配置参数的方法是把它们作为命令行参数传递给 postmaster, 比如
postmaster -c log_connections=yes -c syslog=2这样和上面的例子有同样效果. 命令行选项覆盖任何与 postgresql.conf 冲突的选项.
有时候,给某一个特定后端会话一个命令行参数也是很有用的. 可以在客户端使用环境变量 PGOPTIONS 来实现 这个目的:
env PGOPTIONS='-c geqo=off' psql(这个选项可以用于任何客户端应用,不光是 psql.)请注意,这个变量对那些需要在 服务器启动后固定的选项是无效的,比如端口号.
最后,有些选项可以在独立的 SQL 会话中修改,使用 SET 命令,比如
=> SET ENABLE_SEQSCAN TO OFF;请参考 SQL 命令语言手册获取命令语法的详细信息.
设置在一次索引扫描中优化器计算出来的处理每条索引元组的开销. 这是以一次顺序页面抓取的开销的分数来计量的.
设置优化器计算出来的处理一条 WHERE 子句中的每个操作符的开销. 这是以一次顺序页面抓取的开销的分数来计量的.
设置优化器预计在一次查询中处理每条元组的开销. 这是以一次顺序页面抓取的开销的分数来计量的.
设置优化器假设的磁盘缓冲的有效尺寸(内核的磁盘缓冲中将被 Postgres数据文件使用的比例). 这是以磁盘页面计量的,通常是 8KB/页.
允许或禁止查询规划器使用散列连接( hash-join )规划类型. 缺省是允许.这个选项对调试查询规划器很有用.
允许或禁止查询规划器使用索引扫描规划类型. 缺省是允许.这个选项对调试查询规划器很有用.
允许或禁止查询规划器使用融合连接规划类型. 缺省是允许.这个选项对调试查询规划器很有用.
允许或禁止查询规划器使用嵌套循环连接规划. 实际上不可能完全禁止使用嵌套循环连接,不过把这个选项设置为 禁止会令优化器在存在其它方法的情况下优先选用其它方法. 缺省是允许.这个选项对调试查询规划器很有用.
允许或禁止查询规划器使用顺序扫描规划类型. 实际上不可能完全禁止规划器使用顺序扫描,不过把这个选项设置为 禁止会令优化器在存在其它方法的情况下优先选用其它方法. 缺省是允许.这个选项对调试查询规划器很有用.
允许或禁止查询规划器使用明确的排序步骤. 实际上不可能完全禁止规划器使用排序,不过把这个选项设置为 禁止会令优化器在存在其它方法的情况下优先选用其它方法. 缺省是允许.这个选项对调试查询规划器很有用.
允许或禁止查询规划器使用 TID 扫描规划类型. 缺省是允许.这个选项对调试查询规划器很有用.
允许或禁止基因查询优化,这是一种试图不通过穷举搜索来实现 查询规划的算法.缺省是允许.参阅各种其他 GEQO_ 设置.
各种各样的调节基因查询优化的参数: 缓冲池大小(pool size)是一个全体中的个体的数量.有效值介于 128 和 1024 之间.如果把它设置为 0(缺省),那么就使用 2^(QS+1) 大小的缓冲池,这里 QS 是查询中关系的数量.影响(effort)用于为每一代 计算一个缺省值.有效值是介于 1 和 80 之间的数字,40 是缺省值. 代(Generations)声明算法中的反复次数.此数字必须是正整数. 如果声明了 0,那么就使用 Effort * Log2(PoolSize).此算法的运行 时间大概是缓冲池大小(pool size)和代(Generations)之和的分数. 选择偏移(selection bias)是全体内部的选择性压力 (selective pressure). 其值可以介于 1.50 到 2.00 之间;后者是缺省. 随机种子可以设置为让这个算法表现为能够产生可复现的值.如果把 它设置为 -1 那么此算法的行为将不可判定.
只有当涉及的 FROM 关系数量至少有 GEQO_THRESHOLD 个时,才使用基因查询优化. (请注意一个 JOIN 构造只算做一个 FROM 项.) 缺省是 11,对于数量小于此数的查询,也许使用判定性的穷举搜索更 有效.
Key Set Query Optimizer(键集查询优化) (KSQO)促使查询优化器把一个 WHERE 子句里面 有很多 OR,AND 子句的查询,( 比如 WHERE (a=1 AND b=2) OR (a=2 AND b=3) ...转换成一个 UNION 查询.这个方法比缺省实现快得多, 但是它不一定给出完全一样的结果,因为 UNION 隐含地增加了一条 SELECT DISTINCT 子句以消除重复输出行. 当和类似Microsoft Access这样的 产品一起使用的时候,常常用到 KSQO,因为它总是喜欢生成上面 样子的查询.
以前,对那些有许多 OR 和 AND 子句的查询,KSQO 是绝对必要的,但是到了 Postgres 7.0 和以后,标准的规划器 就可以很合理地处理这些查询.因此缺省是 OFF.
设置优化器计算的一次非顺序磁盘页面抓取的开销. 这是以顺序磁盘页面抓取的开销的倍数计量的.
注意: 糟糕的是,我们没有很好的定义我们上面刚刚描述完的“COST(开销)” 家族的典型值的方法.我们鼓励你自己试验并且与我们共享你的发现.
打开各种断言检查.这是调试助手.如果你经历了奇怪的毛病或者 崩溃,可能你希望把这个选项打开,因为它可能会暴露程序的错误. 要使用这个选项,制作 Postgres 的时候必须定义 USE_ASSERT_CHECKING宏. (参阅配置选项 --enable-cassert). 请注意如果 Postgres 是这样制作的话,那么 DEBUG_ASSERTIONS 缺省是 ON.
这个值越高,那么在服务器运行过程中 就有越多 “调试”日志生成. 缺省时,此值为 0,意味着没有调试输出.目前有意义的最高值为 4.
对于任何执行的查询,把该查询,它生成的分析树,它生成的执行规划,或者其 查询重写输出打印到服务器日志中. 选择 DEBUG_PRETTY_PRINT 会生成漂亮些但是长一些的输出格式. 把 DEBUG_LEVEL 设置为大与零的值会隐含地打开 这些标志中的一些.
缺省时,联接日志只记录所联接主机的 IP 地址.如果你想显示主机名, 你可以打开这个选项,不过,这样有可能带来一些不可忽略的性能损失, --取决于你的名字解析的设置. 这个选项只能在服务器启动的时候设置.
对每次成功的联接都向服务器日志里打印一行信息. 缺省时是关闭的,尽管它可能很有用.这个选项只能在服务器启动的时候设置.
在每条服务器信息前面加上后端服务进程的进程号前缀. 这对理出某条信息属于那个联接很有帮助. 缺省时是关闭的.
在每条服务器信息前面加上时间戳前缀. 缺省时是关闭的.
对每条查询,向服务器日志里输出相应模块的性能统计. 这是原始的调节工具.
在联接日志信息里面显示正在连接的主机的端口号. 你可以回朔此端口号并找出是哪个用户初始化的联接. 因为这个功能基本没用,所以缺省是关闭. 这个选项只能在服务器启动的时候设置.
Postgres 允许把 syslog 作为日志系统.如果这个选项 设为 1,则信息同时往 syslog 和标准输出输出.如果设为 2, 则只输出到 syslog.(有些信息还是会输出到标准输出/标准错误.) 缺省是 0,意味着关闭向 syslog 的输出. 这个选项只能在服务器启动的时候设置.
要使用 syslog,制作 Postgres 时必须打开 --enable-syslog 配置选项.
这个选项在打开 syslog 后判断要使用的 syslog “功能”.你可以从 LOCAL0,LOCAL1,LOCAL2,LOCAL3,LOCAL4,LOCAL5,LOCAL6,LOCAL7 中选择;缺省是 LOCAL0.参阅你的系统的 syslog.
如果打开了向 syslog 中记日志的功能, 这个选项决定用于在 syslog 日志信息中标识 PostgreSQL 的程序名.缺省是 “postgres”.
为 LISTEN 和 NOTIFY 命令生成一大堆调试输出.
这个是以毫秒计的时间,用于设置在检查是否存在死锁条件之前的等待 时间. 检查是否存在死锁条件是一个缓慢的过程,因此我们不希望我们每次 等待锁的时候都运行这个过程.我们(乐观地?)假设在生产应用中的死锁 是不常出现的,因此我们在开始询问是否可以解锁之前只等待一个锁 相对短的一段时间. 增加这个值就减少了浪费在无用的死锁检查上的时间,但是减慢了报告 真正死锁错误的速度. 缺省是 1000(也就是 1 秒),可能是你能够耐心等待的最短时间. 在一个重载的服务器上,你可能需要增大它.这个值的典型设置应该 超过你的事务的时间,这样就可以减少在锁释放之前就开始死锁检查的 问题. 这个选项只能在服务器启动的时候设置.
如果这个选项打开,Postgres后端就会在若干个 位置调用fsync()系统调用以保证更新物理地写入磁盘 而不是悬在写缓冲区里. 这样做增加了一个数据库安装在经历了大规模的操作系统或硬件 崩溃后仍然可用的机会.(数据库服务器的崩溃不会 出现这个问题).
不过,这个操作大大地降低了 Postgres 的速度,因为在所有的这些位置,它都必须 停下来等待操作系统输出它的缓冲区. 没有 fsync的时候,操作系统就可以尽可能地处理好 缓冲,排序,和后写,因此可以有非常显著的性能提升. 不过,如果系统崩溃,一次已经提交的事务的部分数据--对应是磁盘上 的信息--将仍然停留在内存中.就可能导致不连贯的数据
这个选项一直在Postgres用户和开发者社团里有 争论,有些人总是把它关闭,有些人只是在大量数据装载的时候才 关闭它,这样如果出错了的话就有一个显而易见的重新开始的起点. 有些人把它打开只是为了保证安全.因为这样做更安全,所以 缺省是打开的.如果你信任你的操作系统,你的 硬件和你的工具公司(或者是你的 UPS),你可能愿意关闭它.
我们需要指出的是做 fsync 的性能下降在 Postgres 版本 7.1 里面比以前版本显著减少了.如果以前你因为性能原因 禁止了 fsync,那么现在你可能会重新考虑一下.
这个选项只能在服务器启动的时候设置,或者设置在 postgresql.conf 文件里.
设置 Kerberos 服务器密钥文件的位置.参阅 Section 4.2.2 获取细节.
决定允许多少个并发联接.缺省是 32.同时还有一个编译好了的该数值的 硬上限,一般是 1024(两个数都可以在编译服务器时修改). 这个选项只能在服务器启动的时候设置.
设置分析器接受的最大表达式嵌套深度.缺省值对任何常见查询来说 都够高了,但是如果你需要的话你可以提高这个数值. (不过如果你把它升得太高,你就得冒因为栈溢出导致的后端崩溃 的风险.)
服务器侦听的 TCP 端口;缺省 5432.这个选项只能在服务器启动的时候设置.
设置数据库服务器将使用的共享内存缓冲区数量.缺省是 64. 每个缓冲区大小的典型值是 8192 字节. 这个选项只能在服务器启动的时候设置.
安静地运行 postmaster.如果设置这个选项, postmaster 将自动 在后台运行并且抛弃掉控制 tty,因此不会有任意信息输出到标准输出 或标准错误(和 postmaster 的 -S 选项效果相同).除非打开了 比如 syslog 这样的日志系统,我们不建议使用这个选项,因为这样 令查找错误信息非常困难.
声明在求助于临时磁盘文件之前用于内部排序和散列(hash)的内存 的数量.此值是以千字节为计量单位的,缺省为 512KB. 请注意,对于复杂查询,多个排序和/或散列(hash)可能会并行 运行,而且在开始向临时文件输出数据之前, 每个操作都会被允许使用这里声明的数量的内存. 因为每个后端都会做一个或更多的排序,因此需要的空间可能是 SORT_MEM 的许多倍.
这个选项控制继承语义,尤其是在缺省时是否在各种命令里考虑 把子表包括进来. 版本 7.1 以前的特性不是这样的.如果你需要老特性,你可以把这个变量 设为假,但是从长远看来,我们建议你修改你的应用以使用 ONLY 关键字来排除子表.参考 SQL 语言索引 和 用户手册获取关于继承的更多信息.
打开 SSL 联接.使用之前请参阅 Section 3.7 .缺省是关.
如果此值为真,那么服务器接受 TCP/IP 联接. 否则只接受本地的 Unix 域套接字联接. 缺省是关闭. 这个选项只能在服务器启动的时候设置.
声明 postmaster 用于侦听来自客户端应用联接的 Unix 域套接字目录名. 缺省通常是 /tmp,不过可以在制作时改变.
设置 Unix 域套接字的组所有人.(套接字的所有权用户总是启动 postmaster 的用户.)与 UNIX_SOCKET_PERMISSIONS 选项一起使用可以给这种套接字类型增加额外的访问控制机制. 缺省时是一个空字串,也就是使用当前用户的缺省的组. 这个选项只能在服务器启动时设置.
给 Unix 域套接字设置访问权限.Unix 域套接字使用通常的 Unix 文件系统权限集.可选的值可以是一个 chmod 和 umask 系统调用可以接受的数字模式. (要使用客户化的八进制格式,该数字必须以 0 (零)开头.)
缺省权限是 0777,意即任何人都可以联接. 合理的选则可能是0770 (只有用户和组, 参阅UNIX_SOCKET_GROUP)和 0700 (只有用户). (请注意对于 Unix 套接字而言,实际上只有写权限有意义,而且 也没有办法设置或者取消读或执行权限.)
这种访问控制机制是和 Chapter 4. 里面描述的那些完全独立的.
这个选项只能在服务器启动时设置.
声明 postmaster 用于侦听来自客户端应用联接的 TCP/IP 主机名或者地址. 缺省是 PGHOST 环境变量的值, 如果没有设置 PGHOST,缺省是侦听 所有配置了的地址(包括 localhost).
又见 Section 9.3 获取 WAL 调节的细节.
在自动 WAL 检查点之间的最大距离,单位是日志文件段 (每个段一般是 16 兆字节). 这个选项只能在服务器启动的时候设置,或者设置在 postgresql.conf 文件里.
自动 WAL 检查点之间的最长时间,以秒计. 这个选项只能在服务器启动的时候设置,或者设置在 postgresql.conf 文件里.
共享内存中用于 WAL 的磁盘页缓冲区数目. 这个选项只能在服务器启动时设置.
如果为非零,则在标准错误上打开与 WAL 相关的调试输出.
在检查点时预先创建的日志文件数目. 这个选项只能在服务器启动的时候设置,或者设置在 postgresql.conf 文件里.
用于强制 WAL 更新到磁盘上的方法.可能的数值是 FSYNC (在每次提交时调用 fsync()) FDATASYNC (在每次提交时调用 fdatasync()) OPEN_SYNC (用带 O_SYNC 选项的 open 写 WAL 文件),或者是 OPEN_DATASYNC (用带 O_DSYNC 选项的 open 写 WAL 文件). 并非在所有平台上都可以使用这些选项. 这个选项只能在服务器启动的时候设置,或者设置在 postgresql.conf 文件里.
为了方便起见,这里还为许多参数提供了好多单字母选项开关. 它们在下表里描述.
Table 3-1. 短选项键字
短选项 | 等效 | 评注 |
---|---|---|
-B x | shared_buffers = x | |
-d x | debug_level = x | |
-F | fsync = off | |
-h x | virtual_host = x | |
-i | tcpip_socket = on | |
-k x | unix_socket_directory = x | |
-l | ssl = on | |
-N x | max_connections = x | |
-p x | port = x | |
-fi, -fh, -fm, -fn, -fs, -ft | enable_indexscan=off, enable_hashjoin=off, enable_mergejoin=off, enable_nestloop=off, enable_seqscan=off, enable_tidscan=off | * |
-S x | sort_mem = x | * |
-s | show_query_stats = on | * |
-tpa, -tpl, -te | show_parser_stats=on, show_planner_stats=on, show_executor_stats=on | * |
> postmaster -o '-S 1024 -s'或者通过客户端的PGOPTIONS,象前面的例子那样.