开发者生态
morning
PostgreSQL 19 互动导览
2026-09-08
1 阅读
约10分钟阅读
valyala
字号:
PostgreSQL 19 处于测试阶段,预计将于 2026 年 9 月或 10 月左右正式发布,因此现在是抢先了解新功能的好时机。官方发行说明是权威记录:精心组装,完整到提交和每个更改背后的贡献者。本文是他们的实践指南,选择这些条目并将每个条目转变为可运行的示例,以便您可以了解新行为的实际工作原理。在我们开始深入研究新功能之前,让我们先设置一下背景。本文基于官方发行说明和 PostgreSQL 源代码,并在 PostgreSQL License 下获得许可。这并不是一份详尽的清单;请参阅官方发行说明。下面的每个示例都是针对 PostgreSQL 19 beta 3(2026-08-13 发布)运行的,输出是服务器实际打印的内容。链接指向每个功能的文档 (𝗗)、最相关的提交 (𝗖) 和作者 (𝗔);查看它们的动机、用法和实现细节。作者 (𝗔) 是该功能的发行说明中注明的人员,这通常意味着补丁作者而不是单个主要作者。设置好上下文后,让我们开始探索新功能。属性图查询 # 这是发布的标题。 PostgreSQL 19 实现了 SQL/PGQ ,即 SQL:2023 的属性图部分。您可以在现有表上声明属性图,然后使用模式匹配对其进行查询,而不是自己编写联接。两个普通表,上面有一张图: CREATE PROPERTY GRAPH Social VERTEX TABLES ( person KEY ( id ) LABEL person PROPERTIES ( id , name ) ) EDGE TABLES ( follower KEY ( follower , followee ) SOURCE KEY ( follower ) REFERENCES person ( id ) DESTINATION KEY ( followee ) REFERENCES person ( id ) LABEL如下);没有任何内容被复制:社交是一个类似视图的对象,它说“人的行是顶点,跟随的行是边”。现在您可以使用 GRAPH_TABLE 匹配模式,其中 -[...]-> 是有向边: SELECT * FROM GRAPH_TABLE (social MATCH ( a IS person ) - [ IS follower ] -> ( b IS person ) COLUMNS ( a . name AS follower , b . name AS followee ) ) ORDER BY follower , followee ; ┌──────────┬────────┐ │ 追随者 │ 追随者 │ ├──────────┼────────┤ │ Ada │ Bo │ │ Ada │ Dee │ │ Bo │ Cleo │ │ Cleo │ Dee │ └──────────┴────────┘ (4 行) 收益为多跳模式。链接两条边可以为您提供无需自连接的朋友的朋友,空 () 表示“我不关心命名的某个顶点”: SELECT * FROM GRAPH_TABLE (social MATCH ( a IS person WHERE a .name = 'Ada' ) - [ IS follow ] -> () - [ IS follow ] -> ( c IS person ) COLUMNS ( a . name AS start , c . name AS朋友的朋友)); ┌────────┬────────────────┐ │ start │friend_of_friend │ ├──────┼────────────────┤ │ Ada │ Cleo │ └───────┴──────────────┘ (1 行) 这里没有新的执行引擎,这就是重点。 GRAPH_TABLE 被重写为普通关系查询,因此您已经知道的规划器、统计信息和索引选择仍然适用: EXPLAIN ( COSTS OFF ) SELECT * FROM GRAPH_TABLE (social MATCH ( a IS person ) - [ IS follower ] -> ( b IS person ) COLUMNS ( a . name AS follower , b . name AS followee ) ); ┌──────────────────────────────────────────────┐ │ 查询计划 │ ├──────────────────────────────────────────────┤ │ 散列连接 │ │ 散列条件: (follows.followee = person_1.id) │ │ -> 散列连接 │ │ Hash Cond: (follows.follower = person.id) │ │ -> 对 follow 进行顺序扫描 │ │ -> Hash │ │ -> 对 person 进行顺序扫描 │ │ -> Hash │ │ -> 对 person person_1 进行顺序扫描 │ └───────────────────────────────────────────────┘ (9 行) 之前需要了解的一个限制您计划从图形数据库进行迁移:第一次切割没有可变长度路径。像 -[IS follow]->{1,3} 这样的量词会被解析,但会被拒绝,因为元素模式量词不受支持,因此模式必须拼写出每一跳。临时更新和删除 # UPDATE 和 DELETE 上的新 FOR PORTION OF 子句对范围列的切片进行操作。您无需重写整个有效期,而是命名一个子周期,PostgreSQL 会为您拆分该行。该表以一行开头:一个价格在 2026 年全年有效。仅将其更改为 7 月,然后再次查询: SELECT * FROM Price ORDER BY valid_at ;将 valid_at 部分的价格从 '2026-07-01' 更新为 '2026-08-01' 设置金额 = 7 。 99; SELECT * FROM 价格 ORDER BY valid_at ; ┌────────┬────────────────────────┬──────┐ │ sku │ valid_at │ 金额 │ ├────────┼──────────────────────────┼────────┤ │ 小部件 │ [2026-01-01,2027-01-01) │ 9.99 │ └────────┴──────────────────────┴────────┘(1行)更新1 ┌────────┬────────────────────────┬────────┐ │ sku │ valid_at │ 金额 │ ├────────┼──────────────────────┼──────┤ │ 小部件 │ [2026-01-01,2026-07-01) │ 9.99 │ │ 小部件 │ [2026-07-01,2026-08-01) │ 7.99 │ │ 小部件 │ [2026-
这篇文章对您有帮助吗?
订阅66必读
每日精选科技资讯,直达你的邮箱