本文介绍优化图数据库GDB性能的方法,帮助您快速定位图数据库GDB的性能问题,提升查询效率。
设置查询范围
图数据库GDB的查询分析引擎程序能够根据数据输入提供适合需求的查询方式。当查询数据量大时,您可以指定查找数据的范围(特定的label,查询属性的起始范围、终止范围、迭代次数等)。
示例:
推荐方案(将过滤属性限制在10~30内)
g.V().hasLabel("person").has("age",P.gt(10).and(lt(30))).limit(5)
普通方案
g.V().has("age",P.gt(10))
查询最短路径
图数据库GDB采用DFS(深度优先搜索)策略实现最短路径,当您的业务中图数据的连通规模非常大时,您可以在进行最短路径查询时添加限制条件。
示例:
推荐方案(限制了最短路径的最大深度)
g.V($startV).repeat(both().simplePath()).until(hasId($endV).or().loops().is(gt($depth))).hasId($endV).path()
普通方案
g.V($startV).repeat(both().simplePath()).until(hasId($endV))
当您的业务中需要将数据按照权重进行最短路径查询,您可以按照边的权重进行排序。
示例:
g.V(fromVertexId) .repeat(outE().inV().simplePath()) .until(hasId(toVertexId).or().loops().is(gt(deepLimit))) .hasId(toVertexId).path().as(‘p’) .map(unfold().coalesce(values(‘weight’),constant(0.0)).sum()) .as(‘cost’).select(‘cost’,’p’).order().by(select(“cost”),Order.incr)
规避超级顶点
图数据库GDB具有自动索引机制和强大的统计分析引擎,为您提供适合的执行优化。即使如此,也建议您在使用图数据库GDB时通过规则规避业务中的超级顶点。
查询修改的合并语句
如果您的业务需要在使用Gremlin查询的同时修改property
,您可以使用查询修改的合并语句。
示例:
g.V("test").property("nums", union(values("nums"), constant(1)).sum())
查询超时分析
如果您的业务场景比较复杂,容易出现超时的情况,您可以使用profile()
语句,对查询中每一步的执行性能进行分析。通过性能分析,您可以对查询执行中涉及到的数据分布情况有明确了解(例如超级顶点、随机查询大量数据、属性过滤等比较耗时的数据)。
查询请求示例:
g.V().out().limit(10).profile()
返回数据示例:
==>Traversal Metrics
Step Count Traverses Time (ms) % Dur
=============================================================================================================
GraphDbGraphStep(vertex,[]) 29 29 1.657 77.43
VertexStep(OUT,vertex) 11 11 0.410 19.18
RangeGlobalStep(0,10) 10 10 0.072 3.39
>TOTAL - - 2.140 -
执行profile()
后生成的TraversalMetrics
对象包含如下信息:
Step
(步骤):当前在遍历中被分析的步骤,更多信息请参见Gremlin(中文)。Count
(计数):通过该步骤过滤的遍历数量。Traverses
(遍历):通过该步骤过滤的去重后的遍历数量。Time (ms)
(时间):该步骤主动执行遍历的总时间,单位:毫秒。% Dur
:该步骤的耗时占总时间的百分比。
DMS不支持profile()
命令,建议您通过Gremlin Console连接实例后使用该命令。如何通过Gremlin Console连接实例,请参见通过Gremlin Console连接实例。