9.6 新特性
PostgreSQL 9.6 的新特性
此页面正在建设中,将包括 PostgreSQL 9.6 特性和变更的详细信息。感谢 Thom Brown 整理了最初的列表。
并行查询
并行顺序扫描
PostgreSQL 现在可以在多个并行进程中执行完整表扫描,最多可达用户设置的限制。
链接
并行连接
链接
并行聚合
并行聚合允许聚合函数由多个工作进程并发处理。这可以显着提高聚合大量元组到仅几个聚合组的查询的响应时间,前提是服务器有足够的空闲 CPU,否则将受限于后端进程运行的单个 CPU。每个工作进程在元组子集上操作,并创建一个部分聚合结果,它将返回到主后端进程,在那里每个部分结果将与来自其他工作进程的结果组合在一起,并生成最终的聚合结果。
大多数内部聚合函数支持并行模式。用户定义的聚合将需要更改以添加组合函数,并且在聚合函数返回 INTERNAL 状态的情况下,可能需要添加序列化和反序列化。
链接
postgres_fdw
排序下推
链接
连接下推
链接
DML (UPDATE/DELETE) 下推
链接
操作符和函数下推
链接
复制
新的 remote_apply 复制模式,该模式将等待确认备用服务器已应用更改
链接
支持多个同步备用服务器
链接
pg_stat_wal_receiver
链接
复制槽可在创建时分配 WAL
链接
文本搜索
短语全文搜索
链接
可编辑的 tsvector 字段
现在可以详细修改 tsvector 字段以微调可搜索性。
链接
事务、VACUUM 和可见性映射
用于检查可见性映射的 pg_visibility 扩展
链接
可见性映射中的冻结页面数据,用于跳过对已冻结数据的真空操作
链接
用户定义的快照过期时间,用于控制表膨胀
到目前为止,长时间运行的报告或游标显示查询结果可能会阻止清除死行,从而导致数据库中所有易失表膨胀。唯一的选择是允许膨胀、暂停对其他表的正常更新或终止长时间运行的活动 - 这可能与膨胀表完全无关。膨胀的累积会导致性能问题和存储空间过度使用。
一个名为 old_snapshot_threshold 的新配置选项允许集群配置为在更新或删除它的事务(导致它成为死行)完成且仍能看到它的所有快照都达到一定年龄时,允许清除死行,而不会立即终止使用此类快照的活动。例如,如果一个大型月度报告在 etl_monthly 表中运行(该表目前没有变化),则其他表的膨胀将受到限制,并且报告可以在不发生错误的情况下运行到完成。如果快照已超过阈值,并且查询使用该快照尝试从最近修改的页面读取数据(该页面可能不会产生准确的结果),则会抛出“快照太旧”错误。通常,在配置 old_snapshot_threshold 时,目标是将其设置为足够高以使此类错误很少出现,同时防止膨胀引起的问题。
链接
psql
\ev 和 \sv 命令用于编辑视图
链接
用于显示后端 PId 的提示变量
链接
多个 -c 和 -f 选项
psql 中的交叉表
\crosstabview 是一种完全不同的显示查询结果的方式:与垂直显示行不同,数据值放置在网格中,其中列和行标题来自数据本身,类似于电子表格。
SQL 命令
ALTER TABLE ADD COLUMN IF NOT EXISTS
链接
ALTER TABLE SET 及其锁
链接
COPY 和 DML 语句 (CTE)
链接
性能和监控
pg_stat_activity 中的详细等待信息
链接
针对部分索引的索引仅扫描
链接
外部排序操作的性能改进
链接
系统视图和管理
新的系统视图 pg_config
pg_blocking_pids
链接
函数 pg_get_* 在无效对象上返回 NULL
在 9.6 之前,这些函数很容易遇到“缓存查找”错误。
链接
pg_notification_queue_usage 用于查看通知队列
链接
备份
pg_basebackup 扩展了复制槽
链接
用于热物理备份的新 API
在 PostgreSQL 9.6 之前,执行并发物理备份的唯一方法是通过 pg_basebackup,通过流复制协议。低级文件系统复制仅在独占模式下可用,通过调用 pg_start_backup()、启动数据文件复制,然后最终调用 pg_stop_backup()。
一个接一个备份的限制已经被一个新的原生 API 克服,该 API 重定义了 pg_start_backup() 方法,并为 pg_stop_backup() 添加了一个变体。为了向后兼容,保留了较旧的签名。
新的 pg_start_backup 函数现在接受第三个可选参数,称为“exclusive”,该参数默认设置为“true”,以实现向后兼容性。启动并发(或者如果您愿意,非独占)备份非常简单
SELECT pg_start_backup('my_label', false, false);
如果您不熟悉 pg_start_backup(),第一个参数是备份的标签,第二个参数是请求快速检查点操作。第三个参数,当设置为 false 时,请求并发备份
postgres=# SELECT pg_start_backup('my_label', true, false); -[ RECORD 1 ]---+---------- pg_start_backup | 0/F000028
请求并发备份的 PostgreSQL 连接需要在整个数据文件物理复制过程中保持活动状态(使用您最喜欢的工具,如 rsync、cp、tar、SAN 或 LVM 快照,...)。注意:此操作遵循与之前版本的 PostgreSQL 相同的程序(有关详细信息,请参阅有关连续归档和时间点恢复的文档)。
完成后,我们需要使用 pg_stop_backup() 的新版本来指定我们正在关闭当前的非独占备份
SELECT * FROM pg_stop_backup(false);
不同的签名有一个强制参数,称为“exclusive”,该参数需要设置为“false”才能进行并发备份。原因是该函数返回不同的结果,一个由三个字段组成的行
- LSN,用于备份一致性,在 pg_stop_backup() 时间返回:与之前版本相同
- 标签文件的内容:这需要保存在主备份目录中的“backup_label”中(9.6 中新增)
- 表空间列表:如果非空,这需要保存在主备份目录中的“tablespace_map”中(9.6 中新增)
例如
postgres=# SELECT * FROM pg_stop_backup(false); NOTICE: pg_stop_backup complete, all required WAL segments have been archived -[ RECORD 1 ]------------------------------------------------------------- lsn | 0/F000130 labelfile | START WAL LOCATION: 0/F000028 (file 00000001000000000000000F)+ | CHECKPOINT LOCATION: 0/F000060 + | BACKUP METHOD: streamed + | BACKUP FROM: master + | START TIME: 2016-05-16 09:19:44 CEST + | LABEL: my_label + | spcmapfile | 16386 /Users/gabriele/pg96/tbs1 + | 16388 /Users/gabriele/pg96/tbs2 + |
如您所见,这两个步骤要求用户更改其自定义备份脚本。但是,用户应该期望常见的灾难恢复和备份外部解决方案,例如 Barman、OmniPITR、PgBackRest、pghoard、WAL-E 透明地管理 9.6 中引入的这种新行为。
此新的内核 API 替换了 pgespresso 包,该包之前与 Barman 1.3.1 及更高版本一起使用。Barman 2.0 现在支持 PG9.2-PG9.5 的 pgespresso 和新的 9.6 API。
重要:此新 API 将成为未来协调低级备份操作与 PostgreSQL 的唯一支持方式。
链接
扩展和 Contrib 模块
扩展级联支持以安装依赖项
链接
Cube 扩展 kNN 支持
链接
其他功能
命令进度报告
链接
通用 WAL 工具
链接