嗯嗯,好的,谢谢你了哈,麻烦了
你好,请问下这边关于上周提到的find path内存异常的问题现在有结果了吗?还有请问下目前发现另一个问题,就是3,4跳的MATCH语句在查询的时候,耗时明显高于5跳,而且CPU与内存的消耗也是均高于5跳的,请问这边是正常的吗?
可以帮忙分享 3、4跳和5跳的 explain/profile 么?
你好,目前find path五跳异常的explain就在上面,这边是需要该语句的三跳和四跳的explain或者Profile吗?
可以把 match 的3跳 和5跳的 profile 贴一下,看一下哪里有异常了
刚才说错了,不好意思,上面的是4跳的错误,不是5跳的,今天早上把版本已经升级到了最新的3.0.0了,现在测试发现还是会有这个问题,而且现在3.0.0对于内存异常的语句PROFILE已经不返回执行计划,仅返回错误了,目前该语句3跳和5跳均执行失败,具体的EXPLAIN如下:
三跳:
五跳:
目前的推测,是 match 语句中 id(v)==“45710364” and id(t) == “a0561bad21db3ba82eed9cf6a3850ed5” ,这个条件会 选取一个点 进行拓展,根据数据分布的不同,选取 v 点拓展 和选取 t 点拓展 的性能和内存占用可能会不一样,而 find path 是从两边开始拓展,所以不会因为数据分布不同而像match 那样有差异
所以理论上MATCH确实会比FIND PATH查询效率低对吧,但是现在的问题主要就是这个语句使用MATCH虽然查询慢,但是还是可以正常查询出来的,但是使用FIND PATH去查询就会导致单机内存溢出,就很奇怪,在测试过程中部分语句返回一万多条数据都可以正常返回,但是这个就是执行不了。
附带:(1)顺便请教一个问题,目前升级到3.0.0后发现match在查询的时候,查询性能好像变化不大,但是内存和CPU的占用相比较2.6.1出现了明显的下滑,请问这个是最近对MATCH做了优化吗?(2)我们测试四跳的MATCH查询性能大概在10s上下,但是FIND PATH的均值在400ms附近,请问这些的性能差距合理吗?
测试match 和 path 的时候 选取的点是随机变的,还是固定的,如果是固定的话,可能会因为数据分布不同造成 match有结果,而find path 内存溢出, 可以使用随机的点,多测几次,尽量消除数据分布的影响
1、对match 和find path的查询性能,理论上find path 要快,因为find path 是双向同时拓展的
还有一点, find path 是双向拓展的,同一时刻 内存中都会保存 正向和反向 两边的数据,而match 是从一个点 拓展的,内存占用量上某一时刻 find path 是比match 要多
所以这里的FIND PATH查询导致内存溢出,但是MATCH查询可以正常查询,是否可以这样理解:SQL执行的时候,执行器做了优化,MATCH语句找了A点和B点中3跳数据少的那个点作为起始点(假设A点,具体每点对应条数的数量上面有),所以此查询中MATCH就出现了可以查询,并且占用内存很少的情况下就查询出了结果,但是对于FIND PATH语句来说,采用双向拓扑查询,A/B两点都需要进行拓扑查询,对于数量较多的B点导致查询过程中出现数据量迭代,内存暴增的情况?
这个不确定,因为目前优化器 是 RBO的,还没有CBO,所以选择哪个点 可能是根据hash之后的结果,哪个先遇到,就选哪个
我将上面说可以正常测试的MATCH语句中的两点的ID进行调换,将B点放到了前面,A点放到了后面,查询导致了内存溢出,所以应该是之前查询顺序的问题,之前将数量小的A点放到了前面可以查询,所以MATCH语句按照上述的MATCH语法是否就是从左侧的起点开始拓扑查询的?
不是的,是 id(v) 和id(t). v和t 这两个字母 会提取出来放到哈希表中, 就看哈希的结果 哪个在前面,就选哪个
那请问下针对我的这种情况,就是A点和B点类似于当前数据量差距大的,A点作为起始点可以正常查询(数据量小),B点作为起始点不能正常查询(数据量大),这种问题有什么办法可以在业务上规避吗?因为查询的时候我们也不清楚A点和B点谁的数据量更大,有什么好点的建议或者通过配置可以在MATCH条件下自动选择数据量少的作为起始点吗?通过提前GO查询?
这个目前还没有 很好的方法规避
好的,谢谢了哈,刚才在文档部署方面,关于生产环境的内存要求的计算公式如下:
然后我计算了一下:
相关配置截图如下:
计算结果如下:
((275562581 + 431847342) * 16 + 3 * (67108864 * 4 + 2048 * 1024 * 1024)) * 1.2 = 20.749G
那是不是代表着我正常使用最大查询数量的时候内存消耗也应该在20.749G以内吗?
而且请问下3.0.0版本的match语句在执行的时候不会触发内存预警吗?find path正常到阈值时会自动停止,但是match语句会继续增长,直到把内存撑满,graphd自动exited。
这个 预估 不是代表着上限,而是代表正常使用的要求