Hubert 'depesz' Lubaczewski:等待PostgreSQL 19——SQL属性图查询(SQL/PGQ)

💡 原文英文,约500词,阅读约需2分钟。
📝

内容提要

PostgreSQL 19将引入SQL属性图查询(SQL/PGQ),支持图模式匹配,新增GRAPH_TABLE函数、属性图DDL命令及系统目录。作者虽承认其重要性,但认为语法复杂,优势不明显,更倾向传统JOIN写法,并推荐相关博客供深入理解。

🔎

延伸解读

SQL/PGQ 的定位与实现方式

SQL/PGQ 是 SQL 标准(ISO/IEC 9075-16:2023)的一部分,PostgreSQL 19 通过新增 GRAPH_TABLE 函数、属性图 DDL 命令以及系统目录来实现。属性图在内部被重写为关系查询,行为类似视图,访问权限与安全调用者视图一致。这意味着它并非全新的存储引擎,而是基于现有关系模型的一种查询语法扩展。

语法复杂度与学习成本

作者认为 SQL/PGQ 的语法比传统 JOIN 更复杂,例如查询“谁认识谁”需要编写 GRAPH_TABLE 和 MATCH 子句,而传统写法更直观。这种新语法需要额外学习成本,且当前优势不明显。对于熟悉 SQL 的开发者,可能更倾向于使用熟悉的 JOIN 写法,除非未来有更多便利特性加入。

潜在应用场景与未来展望

尽管作者持保留态度,但 SQL/PGQ 作为标准特性,可能为图查询提供更标准化的方式,未来可能简化某些复杂查询的编写。文章推荐了 CYBERTEC 的系列博客,涵盖图处理、异构图和查询重写等主题,可帮助读者深入理解其原理和应用。

Q&A

PostgreSQL 19 中的 SQL 属性图查询(SQL/PGQ)是什么?

SQL/PGQ 是 PostgreSQL 19 引入的 SQL 标准(ISO/IEC 9075-16:2023)实现,用于属性图查询。它通过 GRAPH_TABLE 函数支持图模式匹配,并提供了创建和管理属性图的 DDL 命令。

PostgreSQL 19 的 SQL/PGQ 新增了哪些功能?

新增了 GRAPH_TABLE 表函数用于图模式匹配,CREATE/ALTER/DROP PROPERTY GRAPH 命令,多个系统目录和信息模式视图,psql 的 \dG 命令,以及 pg_get_propgraphdef() 函数用于 pg_dump 和 psql。

PostgreSQL 19 中属性图是如何存储和处理的?

属性图是一种新的 relkind(RELKIND_PROPGRAPH),在很多方面类似于视图。它在重写器中被重写为标准的关联查询,访问权限类似于安全调用者视图(security invoker view),目前未实现安全定义者(security definer)变体。

SQL/PGQ 的图模式匹配语法与传统 SQL 的 JOIN 写法有何不同?

传统写法使用 JOIN 连接表,例如:select count(*) from knows k1 join knows k2 on k1.b = k2.a where k1.a = 42; 而 SQL/PGQ 使用 GRAPH_TABLE 和 MATCH 子句,例如:SELECT count(*) FROM GRAPH_TABLE(big_social MATCH (a IS person WHERE a.id = 42)-[IS knows]->(b IS person)-[IS knows]->(c IS person) COLUMNS (c.id)); 语法更符号化,但作者认为其优势不明显。

作者对 SQL/PGQ 持什么态度?

作者承认 SQL/PGQ 很重要,但个人认为其语法复杂,优势不明显,更倾向于传统的 JOIN 写法。他推荐了 CYBERTEC 的系列博客文章,以帮助深入理解。

SQL/PGQ 的文档在哪里可以找到?

起始文档可以在 doc/src/sgml/ddl.sgml 和 doc/src/sgml/queries.sgml 中找到。

🏷️

标签

➡️

继续阅读