指日可待(17个锦囊+1个空锦囊),PostgreSQL 10新特性

指日可待,Postgresql 10新特性

该文由 Robert Haas 撰写,只是翻译

英文原址

这些即将在Postgresql 10中到来的新特性会给人印象深刻,自8.4版本以来 Haas就一直参与Postgresql项目,并未曾大开眼界, 许多人已经在不同的地方讲解了这些特性,这里只是特性的汇总, 于我见,这些事Postgresql10中可见的最大的一些变更。 [免责声明: (1) 其他人可能持有不同的意见 (2) 一些已经加进去的补丁再被退回,基本是不可能的 (3) 这些由整个Postgresql完成的工作,不是个人,不提供保证 ]

重要特性

声明分区

在以前的版本中,Postgresql提供了表继承来模拟表分区,但是,配置复杂,性能并不很好。在Postgresql 10中,使用专用语法可以使用列表或者范围分区,并且INSERT性能拥有较高的提升。未来的版本中,在提高性能,填充特性方面还有更多的工作要做,但是在v10中已经是一个不错的开头(IMHO,无论如何)。

[逻辑复制]

Postgresql从版本9.0开始拥有了物理复制(通常称为流式传输复制),但这需要复制整个数据库,不能容忍任何形式的备用服务器上的写操作,对于跨版本或数据库系统进行复制是无用的。 自从版本9.4以来,Postgresql已经拥有了逻辑解码 - 基本上是改变了捕获 - 并被热情接受,但是无法使用某种类型的附加功能,它不能用于复制。 Postgresql 10添加了非常容易配置的逻辑复制,并以表格粒度工作,显然是巨大的进步。 它将[为您提供复制初始数据,并然后保持最新的功能

##[改进的并行查询]

虽然Postgresql 9.6拥有了并行查询,但在Postgresql 10中该特性得到了显著改善,包括有并行位图堆扫描,并行索引扫描等新功能。 并行查询通常可以得到2-4倍的加速,这些增强功能为更多种类的查询提供加速。

##SCRAM认证.

Postgresql提供了各种不同的身份验证方法包括Kerberos,sspI和SSL证书等认证方法,这些身份验证方法拥有较高的安全性。然而,有时用户只想使用由Postgresql服务器本身管理的密码。在现有版本中,可以使用密码验证类型完成,该类型仅通过线路发送用户提供的密码,或通过md5验证类型,该类型通过线路发送密码和盐渍版本。在后一种方法中,从数据库中窃取散列密码或将其嗅探在线上等同于窃取密码本身,即使您无法计算前置图像。 Postgresql 10引入了scram认证,特别是SCRAM-SHA-256,它更加安全。服务器存储在磁盘上的信息和认证交换的内容都不足以使服务器模拟客户端。当然,SHA-256替代MD5也是一个很大的改进。另请参阅 [Michael Paquier] (http://paquier.xyz/postgresql-2/postgres-10-scram-authentication/) 关于这个话题的博客。需要注意的一点是,除非您使用libpq,否则您将无法使用此功能,除非您的特定客户端驱动程序已使用SCRAM支持进行更新,因此在此功能普遍可用之前可能会有一段时间。

##执行器加速

Postgresql执行器的重要部分已被重写,使得表达和目标列表投影更快; 即时编译(JIT)将在以后的版本中添加。 哈希聚合已被重写,使用更有效的哈希表,并在其中存储较窄的元组,并且还进行了工作,以加快计算多个聚合Join的查询,其中一方可以被证明是唯一的。 分组集(group sets)现在支持hash聚合。 虽然所有Postgresql版本通常至少包含一些性能改进,但是表达式和目标列表投影的重写是一个特别大且显着的改进,这将有益于许多用户

强大的Hash 索引

Postgresql中的散列索引遭受了多年的长期忽视; 情况将在v10中明显改善。 最显着的变化是,哈希索引的更改现在写入WAL,这意味着它们是安全的,并且它们被正确地复制到standbys。 然而,已经做了大量的其他工作,包括提高性能和并发性的前提-改进桶拆分算法元页缓存以获得更好的性能增加一页一次的页整理VACUUM,并将其扩展更多地方。 Amit Kapila甚至写道,他们的表现超过了btree指数。 虽然这里有更多的工作要做,但我对这些改进感到兴奋。

##ICU排序支持

在当前发布版本中,Postgresql完全依赖操作系统提供的归类,但这有时会导致问题: 操作系统之间的排序规则行为往往不同,特别是在Linux和Windows之间,并不总是很容易找到一个操作的排序规则系统的行为与另一个系统上可用的某些归类的行为相匹配。此外,至少在Red Hat上,glibc会定期围绕次要版本中的OS本机对齐行为进行操作,这会破坏Postgresql的索引,因为索引顺序可能不再符合(修订的)排序规则。对我来说,在维护版本中改变广泛使用的系统调用的行为似乎与恶人交好,但是glibc维护者显然不同意。 (事实上,有一个讨论,建议你不要使用其中的一些接口)。另一方面,libicu说他们关心这个

#还有,更多

据我估计,上面列出的功能用户期望在Postgresql 10中最令人兴奋的事情,预计将在9月份发布。 然而,还有很多其他重要功能。 这里是其中的一些:

##扩展统计(ndistinct函数依赖) 。

如果拥有错误的行估计查询计划会比较糟糕,那么您如何解决? 通过扩展统计信息,你可以告诉系统根据你指定的参数收集其他统计信息,这可能有助于您正确使用计划。

FDW 聚合下推

在以前的版本中,SELECT COUNT(*)FROM foreign_table会通过从外部表中拉取每一行并在本地聚合来计算。 那太可怕了,当然现在不必了。

##过渡表

现在可以编写一个PL/pgsql AFTER STATEMENT触发器,可以访问由语句修改的所有行。 这可以比写入每行调用一次的AFTER ROW触发器更快更方便。

改进的等待事件##

Postgresql 9.6中引入了pg_stat_activity中的等待事件监视,但仅限于有限的事件。 在Postgresql 10中,即使对于辅助进程和未连接的后台工作人员,还可以看到锁存器等待和I/O等待。

新的完整性检查工具

现在,可以用新的amcheck模块来验证btree索引的完整性。 如果你是开发人员将预写日志记录添加到新的存储表单,或者你认为开发人员可能引入了BUG,那么你能够使用wal_consistency_checking进行测试。 pg_dump现在有更好的测试覆盖。

##[更智能的连接]

通过libpq的连接现在可以指定多个主机,甚至可以告诉它找到当前正在接受写连接的服务器

基于Quorum(裁判)的同步复制

现在可以指定任 K/N 个备用同步服务器必须确认提交,从而提高灵活性和性能

其他酷的更新

此版本中还有很多其他的改进。 XMLTABLE使得查询XML数据更快更容易。 你现在可以直接询问事务的提交状态,我们可以更好地跟踪复制滞后。 psql现在支持 \if ... \ elseif ... \ else ... \ endif,使脚本更容易,并且有新函数和新角色允许监视工具在没有超级用户权限的情况下运行。 编码转换现在更快,排序也是如此。 您可以在流式传输时压缩事务日志。 还有更多的,但这个博文已经太久了。 如果您有兴趣阅读更多关于Postgresql 10将要推出的新功能,那么经常会在这主题上关注博客,Michael Paquier也是如此。 两者都有关于这里提到的一些功能的其他细节,以及可能感兴趣的其他功能

最后一点:

##我们考虑到一个长远问题

用户误以为pg_xlog或pg_clog目录中数据为非关键数据,可能是因为目录名称中包含单词 log。 这些目录已经重命名pg_walpg_xact,我们希望这些目录名称拥有更清晰的含义。 以前包含字符串xlog的所有sql函数和组件(意思是事务日志或预写日志)已被重命名为使用wal。 相反,认日志目录现在称为log而不是pg_log,因此,它看起来不那么像内部名称。 这些变更可能会对一些用户升级造成不便,当然,我们的初心是希望能帮助用户避免灾难性的错误

追加:

##关于列存:

有几个人一直在努力,但目前还没有人提交补丁(至少是IMHO)。 我认为要从列存储中获得很大的收益,先需要对执行器做一些更改 - 例如,我们不会支持个别的列存,直到最后的可能阶段。 没有执行器的支持,列存储库可能不太好。 所以可能还有一些其他工作要先做。

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...