PostgreSQL的第12版并不是刚刚发布,因为已经宣布了第一个次要发行版。但是,可以客观地说,对于大多数用户而言此版本仍可以视为全新版本,并且肯定只有一小部分用户已升级。因此,我认为有必要介绍一些新功能。
像往常一样,planet.postgresql.org提要上已经有很多关于该主题的文章,因此,我将尝试从另一个角度进行介绍,而不仅要关注PostgreSQL版本12的主要功能。不过,此版本更多是“基础结构”版本,在涉及到一些很棒的新功能(特殊除外)时,可能不像v11那样令人兴奋-但是,请注意一下,因为每个版本中都有数百个小变化,所以我相信您会发现自己的新事物。完整的发行说明可以在这里找到– https://www.postgresql.org/docs/12/release-12.html
“自动”性能改进
尽管一般而言,此发行版可能不是最快的发行版,但由于某些基础结构更改还提供了其他好处,但在某些方面,您无需进行任何操作即可立即获得巨大的性能提升:
自动内联通用表表达式(CTE)
这应该为99%的用例提供性能提升–对于那些您不想从过滤器下推和索引扫描中受益的罕见例外(例如,在极少数情况下极端膨胀或计划者行计数错误的情况)一个问题),您可以使用“ MATERIALIZED”关键字覆盖它,例如:
WITH w AS MATERIALIZED ( SELECT * FROM pgbench_accounts ) SELECT * FROM w WHERE aid = 1;
复制
在SERIALIZABLE隔离模式下时允许并行查询
可序列化的隔离模式由于会导致性能下降而在野外很少见,但是从技术上讲,它是修复糟糕的应用程序的最简单方法,没有适当考虑所有并行活动–现在,它已针对大量数据进行了改进!请注意,对于CPU较低的计算机,我通常建议稍微提高默认并行化阈值(min_parallel_index_scan_size / min_parallel_table_scan_size)。原因是创建OS进程和同步都会产生成本,而对于较小的数据集,最终实际上可能会更慢。
默认情况下启用即时(JIT)编译
v11中引入了此功能,对于那些在Postgres上实施数据仓库的人来说,这是可选的“杀手级功能”,最多可提高50%。由于没有发现其功能非常复杂的大问题,因此默认情况下已启用它,并且启动频率也更高。不过,在今年的pgConf.EU上有一个免责声明–在极少数情况下,对于非常复杂的查询,JIT代码生成+优化执行比普通的非最佳执行需要更多的时间!幸运的是,它是“用户”级功能,可以在每个会话/事务中禁用。或者,您也可以调整“快速”阈值参数系列(jit _ * _ cost),以便中小型数据集不会使用它们。
支持SQL / JSON路径语言
如本节标题所述,此功能是SQL标准的实现,并且允许轻松选择和过滤JSON对象的特定元素,例如,以便以更标准的方式创建联接。顺便说一下,现在有大量的新结构/功能可用,因此下面仅显示最基本的示例。有关更多信息,请检查文档– https://www.postgresql.org/docs/12/functions-json.html#FUNCTIONS-SQLJSON-PATH
krl@postgres=# select jsonb_path_query( '{"results": [{"id": 10, "name": "Frank"}, {"id": 11, "name": "Annie"}] }'::jsonb, '$.results[*].id' ); jsonb_path_query ────────────────── 10 11 (2 rows)
复制
允许外键引用分区表
通过此功能,从v12开始,PostgreSQL的分区功能可以称为完整功能。但是,此FK功能有一个小陷阱,在某些情况下限制了它的用处:被引用的列必须是分区键的一部分!遗憾的是,这在典型的基于日期的分区方案中效果不佳,因此您需要求助于常见的黑客攻击,例如自定义验证触发器或定期运行某些FK检查脚本。
添加分区自检功能
新的pg_partition_root(),pg_partition_ancestors()和pg_partition_tree()函数听起来像(嗯,pg_partition_tree()并不可视化一棵真正的树,而只是一张桌子),并且是一个真正的福音,特别是对于那些进行多级分区。
添加连接参数tcp_user_timeout以控制libpq的TCP超时
并非所有人都可以使用,但是这是一种有用的新方法,可以从客户端发出信号,表明您的网络状况不佳,或者介于两者之间的防火墙过于激进。如果出现问题,您将希望尽快取消分配会话资源。还有一些服务器端“ keepalive”参数处理相同的主题,但不完全相同。这些参数用于空闲连接,并且以秒为单位(而不是毫秒)来度量事物。
在psql的“ \ h [elp]”输出中显示用于SQL命令的手册页URL
这对于可能需要一些命令的更多背景信息的初学者来说是完美的,因为默认的“帮助”非常简洁(当然是故意的!)。特别是欢呼声-该功能是根据我的建议/投诉而添加的🙂谢谢大家,您真棒!
允许VACUUM跳过索引清理
根据文档-禁用索引清理可以显着加快VACUUM(您拥有的索引越多,它越引人注目)-因此,当您需要快速推出某些模式更改并愿意接受代价的情况时,它是完美的选择如果同时进行大量UPDATE活动,则索引会更膨胀。
添加EXPLAIN选项SETTINGS以输出非默认优化器设置
对于那些由于精神压力而容易错过显而易见的紧急情况,这是一个很好的补充。Git日志条目说明了一切:查询计划受许多配置选项的影响,知道其中哪些选项设置为非默认值可能至关重要。使用此补丁程序,您可以说“解释”(“设置为开”)以将该信息包括在查询计划中。仅打印那些影响计划并包含与内置默认值不同的值的选项。
仅允许从一定百分比的事务中记录语句
新的“ log_transaction_sample_rate”执行上述操作。对于那些希望从日志中获取真实,可执行,SQL示例的疑难解答案例非常有用(pg_stat_statements已经适用于参数化语句),但又不希望对性能产生负面影响或填充日志。顺便说一句,如果您坚持使用较低的Postgres版本,并且在不久的将来无法升级,请尝试使用“ auto_explain”扩展的“ sample_rate”以有效地实现相同的功能(尽管有些冗长的EXPLAIN输出) ,它已经存在了多年。
默认情况下,导致恢复进入最新时间线
最后!以前默认的recovery_target_timeline设置为“当前”是使用PostgreSQL的“级联复制”功能的初学者的主要绊脚石,多年来引起了我的很多支持咨询。现在,它默认应为“最新”。
并行自动索引重建
REINDEX CONCURRENTLY是v12版本的“头条新闻”功能之一,这是当之无愧的荣誉:以前,类似的行为需要大量的脚本编写,因此非常繁琐且也有些危险(非严重)。
现在,“ pg_checksums”实用程序可以启用/禁用脱机集群的页面校验和PostgreSQL端的校验和是一个“早期预警”系统,用于检测静默数据损坏(不过仅适用于被触摸的块),实际上应该始终启用它。以前,一旦错过初始化,就无法在以后修复。好吧,仅通过转储/重新加载或通过逻辑复制进行升级……这可能并不总是理想或可行的。因此,这是一个非常受欢迎的补充。
我们在这里谈论多大的停机时间?不太多-例如,对于我的64 GB测试实例,它花费了5分钟。但是我认为有一些计划可以对其进行进一步改进以支持“实时”过渡。而且使进程并行化当然也将有所帮助,当前它似乎是单线程的,因为它既不会耗尽我的CPU,也不会耗尽我SSD的IO子系统。不过,对于“实时”场景而言,它并不重要。如果该实用程序可以处理某些较旧的Postgres版本,也很好-例如,当我尝试使用它时,它会以“错误:pg_control CRC值不正确”的形式保全v11。好吧,我想我们不可能拥有全部。
/usr/lib/postgresql/12/bin/pg_checksums --enable --progress -v -D /var/lib/postgresql/12/main/ .... pg_checksums: checksums enabled in file "12/main//base/13397/2836" 64063/64063 MB (100%) computed Checksum operation completed Files scanned: 1035 Blocks scanned: 8200102 pg_checksums: syncing data directory pg_checksums: updating control file Data checksum version: 1 Checksums enabled in cluster
复制
允许分区表的CREATE TABLE表空间规范影响其子表空间
以前,您仅依赖于“ default_tablespace”参数的正确用法,因此,一旦您确实需要进行一些表空间管理时,此功能将使DBA的工作变得更加轻松。对于“过渡” Oracle DBA,您不需要或不想在PostgreSQL中“只是为了好玩”任何额外的表空间,这只会使您的生活变得比所需要的更为复杂。
允许将查询产生的值分配给pgbench变量
这是我最喜欢的应用程序之一,我通常是pgbench的大量用户。那它允许我做什么?例如,它允许我仅使用pgbench生成的帐户的子集来快速模拟某些锁定情况,或者强制进行某种形式的帐户更新命令。pgbench脚本语言命令是“ \ gset”,其代码如下所示:
\set bid random(1, 1 * :scale) \set tid random(1, 10 * :scale) \set delta random(-5000, 5000) BEGIN; select aid from pgbench_accounts where abalance = 0 order by aid limit 1 \gset UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid; SELECT abalance FROM pgbench_accounts WHERE aid = :aid; UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid; UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid; INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP); END;
复制
允许小数输入整数服务器参数
例如,现在允许SET work_mem =‘1.5GB’。代码更改很小,但是很方便。
允许vacuumdb根据其环绕范围为真空选择表
对于大型数据库而言,这可能是真正的救星,大型数据库中的Autovacuum长时间处于不受检查状态,并且可环绕的水平正在接近(警告消息将在修改的日志中弹出),并且需要一些快速的手动响应以避免有效的停机时间。
总结
最后,我将重复发行说明中的内容,并提及复制管理中的重大突破,以防万一您忘记了–“ recovery.conf”文件已死,消失,历史!现在,相关设置位于主服务器conf(postgresql.conf / postgresql.auto.conf)中。这意味着如果您不使用任何第三方工具来处理复制脚本,则需要进行更新,但是这样做的好处是文件数量更少,现在可以从Postgres会话中检查这些设置。