内存配置优化:
PG中与内存有关的配置参数:
shared_buffers:共享缓存区的大小,相当于Oracle中的SGA,推荐为内存的1/4,不超过总内存的1/2。从PG9.3开始,共享内存已从System V方式改为了Posix方式和mmap方式,因此在pg9.3以后不需要配置Linux的shmmax和shmall参数,之前的版本还需要配置。shmmax:表示单个共享内存段可以创建的最大值,shmall:表示整个系统内可以为共享内存配置的页面数。
work_mem:为每个进程单独分配的内存,主要用于排序、hash等操作
maintence_work_mem:也是为每个进程单独分配的内存,但主要用于维护操作,如vacuum

PG9.4以后开始支持大页,打开大页的方法:
huge_pages=try
设置为try后,pg会尝试使用大页,如果操作系统没有配置大页或配置的大页小于PG需要的大页内存,那么PG在分配大页失败后,会使用普通内存。如果把huge_pages设置为on,那么分配大页失败后,pg启动也会失败。

vacuum:
定期做vacuum原因:

	1. 标记多版本中不再需要的旧版本行所占用的空间为可用,以重复使用这部分磁盘空间
	2. 更新统计数据,保证执行计划的正确性
	3. 事务ID为32位递增的一个整数,当增加到最大值后,会从起始值开始,这就要保证旧的已提交事务的数据仍然可见,需要把这些行上的事务ID更新为一个永远可见的事务ID(frozen XID)

目前有一下两种vacuum:

	1. 标准的vacuum
	2. vacuum full

vacuum可以与select语句或DML语句并行执行,但是若在清理该表,不能使用alter table此类DDL语句修改表定义。vacuum full需要在表上的一个排斥锁才能工作,不能与其他使用该表的语句并行执行,所以一般使用标准vacuum即可。但vacuum full能释放更多磁盘空间。

#autovacuum = on                        # Enable autovacuum subprocess?  'on'

预写式日志写优化:
以下参数控制检查点发生的频率:

	1. checkpoint_segments
	2. checkpoint_timeout

每写完checkpoint_segments个WAL日志文件或每过checkpoint_timeout秒就创建一个检查点,不管哪个条件满足。也可用命令checkpoint强制创建一个检查点。

wal_buffers:用于指定WAL缓存的大小。
wal_level:决定多少信息写入WAL中。