Hubert 'depesz' Lubaczewski:等待PostgreSQL 19——SQL属性图查询(SQL/PGQ)
内容提要
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 中找到。