有关对 Spanner Graph 查询进行调优的最佳实践

本文档介绍了用于对 Spanner Graph 查询性能进行调优的最佳实践,包括以下优化:

  • 避免对节点和边缘的输入表进行完整扫描。
  • 减少查询需要从存储空间读取的数据量。
  • 减小中间数据的大小。

从基数较低的节点开始

编写路径遍历,使其从基数较低的节点开始。此方法可以保持较小的中间结果集,并加快查询执行速度。

例如,以下查询具有相同的语义:

  • 正向边缘遍历:

    GRAPH FinGraph
    MATCH (p:Person {name:"Alex"})-[:Owns]->(a:Account {is_blocked: true})
    RETURN p.id AS person_id, a.id AS account_id;
    
  • 反向边缘遍历:

    GRAPH FinGraph
    MATCH (a:Account {is_blocked:true})<-[:Owns]-(p:Person {name: "Alex"})
    RETURN p.id AS person_id, a.id AS account_id;
    

假设名为 Alex 的人数少于被屏蔽的账号数,我们建议您采用正向边缘遍历编写此查询。

从基数较低的节点开始对于可变长度的路径遍历尤其重要。以下示例展示了查找与给定账号相隔不超过 3 次转移的账号的推荐方法。

GRAPH FinGraph
MATCH (:Account {id: 7})-[:Transfers]->{1,3}(a:Account)
RETURN a.id;

默认指定所有标签

如果省略了标签,Spanner Graph 会推理符合条件的节点和边缘标签。我们建议您尽可能为所有节点和边缘指定标签,因为这种推理可能并非总是可行,并且可能会导致扫描的标签多于必要数量。

单个 MATCH 语句

以下示例查找与给定账号相隔不超过 3 次转移的关联账号:

GRAPH FinGraph
MATCH (src:Account {id: 7})-[:Transfers]->{1,3}(dst:Account)
RETURN dst.id;

跨 MATCH 语句

当节点和边缘引用同一元素但跨 MATCH 语句时,请对它们指定标签。

以下示例展示了此推荐方法:

GRAPH FinGraph
MATCH (acct:Account {id: 7})-[:Transfers]->{1,3}(other_acct:Account)
RETURN acct, COUNT(DISTINCT other_acct) AS related_accts
GROUP BY acct

NEXT

MATCH (acct:Account)<-[:Owns]-(p:Person)
RETURN p.id AS person, acct.id AS acct, related_accts;

后续步骤