此前在Github 上提了一个PR https://github.com/vesoft-inc/nebula/issues/2864
关于FIND PATH 较neo4j 性能较低的问题,最近在v2.5.1/ v2.6 RC 做了测试,性能并没有提升,
想确认下官方有没有相关计划,感觉最近这个性能较低的碰到的人也挺多的:
- 点属性过滤后续会加吗?
- 延迟较高,这个后续有算法上的优化计划吗?
此前在Github 上提了一个PR https://github.com/vesoft-inc/nebula/issues/2864
关于FIND PATH 较neo4j 性能较低的问题,最近在v2.5.1/ v2.6 RC 做了测试,性能并没有提升,
想确认下官方有没有相关计划,感觉最近这个性能较低的碰到的人也挺多的:
1、由于存储结构不同, neo4j是边存储在一起的,天然就可以一次取到10步内拓扑关系,这个是可预期的
2、点属性的过滤 已经有issue提出,但是目前优先级不是很高,目前在专注优化match 的性能上
3、延迟较高,是网络传输时间高,还是哪个算子的执行时间高,可以profile 看看分析一下
Profile:
(root@nebula) [ProdRelation]> PROFILE FIND SHORTEST PATH FROM 2036276802081017174 TO 3481238469506915583 OVER Employ,Invest,Legal,Branch,HisEmploy,HisInvest,HisLegal BIDIRECT UPTO 10 Steps
Empty set (time spent 18882709/18883228 us)
Execution Plan
-----+--------------+--------------+-----------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------
| id | name | dependencies | profiling data | operator info
|
-----+--------------+--------------+-----------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------
| 9 | DataCollect | 8 | ver: 0, rows: 0, execTime: 3us, totalTime: 5us | outputVar: [
|
| | | | | {
|
| | | | | "colNames": [
|
| | | | | "path"
|
| | | | | ],
|
| | | | | "name": "__DataCollect_9",
|
| | | | | "type": "DATASET"
|
| | | | | }
|
| | | | | ]
|
| | | | | inputVar: [
|
| | | | | {
|
| | | | | "colNames": [
|
| | | | | "_path"
|
| | | | | ],
|
| | | | | "name": "__ConjunctPath_7",
|
| | | | | "type": "DATASET"
|
| | | | | }
|
| | | | | ]
|
| | | | | kind: BFS SHORTEST
|
-----+--------------+--------------+-----------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------
| 8 | Loop | 0 | ver: 0, rows: 1, execTime: 9us, totalTime: 9us | outputVar: [
|
| | | | ver: 1, rows: 1, execTime: 6us, totalTime: 7us | {
|
| | | | ver: 2, rows: 1, execTime: 7us, totalTime: 7us | "colNames": [],
|
| | | | ver: 3, rows: 1, execTime: 13us, totalTime: 13us | "name": "__Loop_8",
|
| | | | ver: 4, rows: 1, execTime: 15us, totalTime: 15us | "type": "DATASET"
|
| | | | ver: 5, rows: 1, execTime: 8us, totalTime: 9us | }
|
| | | | | ]
|
| | | | | inputVar:
|
| | | | | condition: ((++($__VAR_3{0})<=5) AND (($__ConjunctPath_7==__EMPTY__) OR (size($__ConjunctPath_7)==0))) |
| | | | | loopBody: 7
|
-----+--------------+--------------+-----------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------
| 7 | ConjunctPath | 4,6 | ver: 0, rows: 0, execTime: 13us, totalTime: 13us | branch: true, nodeId: 8
|
| | | | ver: 1, rows: 0, execTime: 157us, totalTime: 158us |
|
| | | | ver: 2, rows: 0, execTime: 4920us, totalTime: 4922us | outputVar: [
|
| | | | ver: 3, rows: 0, execTime: 112668us, totalTime: 112670us | {
|
| | | | ver: 4, rows: 0, execTime: 960942us, totalTime: 960944us | "colNames": [
|
| | | | | "_path"
|
| | | | | ],
|
| | | | | "name": "__ConjunctPath_7",
|
| | | | | "type": "DATASET"
|
| | | | | }
|
| | | | | ]
|
| | | | | inputVar: {
|
| | | | | "rightVar": "__VAR_2",
|
| | | | | "leftVar": "__VAR_1"
|
| | | | | }
|
| | | | | kind: BFS
|
| | | | | conditionalVar:
|
| | | | | noloop: true
|
-----+--------------+--------------+-----------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------
| 4 | BFSShortest | 3 | ver: 0, rows: 8, execTime: 28us, totalTime: 29us | outputVar: [
|
| | | | ver: 1, rows: 12, execTime: 39us, totalTime: 40us | {
|
| | | | ver: 2, rows: 3, execTime: 93us, totalTime: 93us | "colNames": [
|
| | | | ver: 3, rows: 1, execTime: 29us, totalTime: 30us | "_vid",
|
| | | | ver: 4, rows: 0, execTime: 35us, totalTime: 36us | "edge"
|
| | | | | ],
|
| | | | | "name": "__VAR_1",
|
| | | | | "type": "DATASET"
|
| | | | | }
|
| | | | | ]
|
| | | | | inputVar: __GetNeighbors_3
|
-----+--------------+--------------+-----------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------
| 3 | GetNeighbors | 2 | { | outputVar: [
|
| | | | ver: 0, rows: 0, execTime: 41us, totalTime: 610us | {
|
| | | | "10.0.7.139":9779 exec/total/vertices: 293(us)/512(us)/1, | "colNames": [],
|
| | | | total_rpc_time: 553(us) | "name": "__GetNeighbors_3",
|
| | | | } | "type": "DATASET"
|
| | | | { | }
|
| | | | ver: 1, rows: 0, execTime: 39us, totalTime: 1431us | ]
|
| | | | "10.0.7.252":9779 exec/total/vertices: 910(us)/1335(us)/3, | inputVar: __VAR_1
|
| | | | total_rpc_time: 1378(us) | space: 68
|
| | | | } | dedup: true
|
| | | | { | limit: -1
|
| | | | ver: 2, rows: 0, execTime: 103us, totalTime: 1295us | filter:
|
| | | | "10.0.7.140":9779 exec/total/vertices: 261(us)/644(us)/1, | orderBy: []
|
| | | | total_rpc_time: 1177(us) | src: $__VAR_1._vid
|
| | | | "10.0.7.251":9779 exec/total/vertices: 304(us)/655(us)/1, | edgeTypes: []
|
| | | | "10.0.7.250":9779 exec/total/vertices: 336(us)/703(us)/1, | edgeDirection: OUT_EDGE
|
| | | | "10.0.7.252":9779 exec/total/vertices: 714(us)/1090(us)/3, | vertexProps:
|
| | | | "10.0.7.141":9779 exec/total/vertices: 722(us)/1121(us)/3, | edgeProps: [
|
| | | | } | {
|
| | | | { | "props": [
|
| | | | ver: 3, rows: 0, execTime: 32us, totalTime: 808us | "_dst",
|
| | | | "10.0.7.250":9779 exec/total/vertices: 323(us)/718(us)/1, | "_type",
|
| | | | total_rpc_time: 763(us) | "_rank"
|
| | | | } | ],
|
| | | | { | "type": "-73"
|
| | | | ver: 4, rows: 0, execTime: 43us, totalTime: 861us | },
|
| | | | "10.0.7.139":9779 exec/total/vertices: 380(us)/749(us)/1, | {
|
| | | | total_rpc_time: 806(us) | "props": [
|
| | | | } | "_dst",
|
| | | | | "_type",
|
| | | | | "_rank"
|
| | | | | ],
|
| | | | | "type": "-71"
|
| | | | | },
|
| | | | | {
|
| | | | | "props": [
|
| | | | | "_dst",
|
| | | | | "_type",
|
| | | | | "_rank"
|
| | | | | ],
|
| | | | | "type": "-72"
|
| | | | | },
|
| | | | | {
|
| | | | | "props": [
|
| | | | | "_dst",
|
| | | | | "_type",
|
| | | | | "_rank"
|
| | | | | ],
|
| | | | | "type": "-99"
|
| | | | | },
|
| | | | | {
|
| | | | | "props": [
|
| | | | | "_dst",
|
| | | | | "_type",
|
| | | | | "_rank"
|
| | | | | ],
|
| | | | | "type": "-100"
|
| | | | | },
|
| | | | | {
|
| | | | | "props": [
|
| | | | | "_dst",
|
| | | | | "_type",
|
| | | | | "_rank"
|
| | | | | ],
|
| | | | | "type": "-101"
|
| | | | | },
|
| | | | | {
|
| | | | | "props": [
|
| | | | | "_dst",
|
| | | | | "_type",
|
| | | | | "_rank"
|
| | | | | ],
|
| | | | | "type": "-102"
|
| | | | | },
|
| | | | | {
|
| | | | | "props": [
|
| | | | | "_dst",
|
| | | | | "_type",
|
| | | | | "_rank"
|
| | | | | ],
|
| | | | | "type": "73"
|
| | | | | },
|
| | | | | {
|
| | | | | "props": [
|
| | | | | "_dst",
|
| | | | | "_type",
|
| | | | | "_rank"
|
| | | | | ],
|
| | | | | "type": "71"
|
| | | | | },
|
| | | | | {
|
| | | | | "props": [
|
| | | | | "_dst",
|
| | | | | "_type",
|
| | | | | "_rank"
|
| | | | | ],
|
| | | | | "type": "72"
|
| | | | | },
|
| | | | | {
|
| | | | | "props": [
|
| | | | | "_dst",
|
| | | | | "_type",
|
| | | | | "_rank"
|
| | | | | ],
|
| | | | | "type": "99"
|
| | | | | },
|
| | | | | {
|
| | | | | "props": [
|
| | | | | "_dst",
|
| | | | | "_type",
|
| | | | | "_rank"
|
| | | | | ],
|
| | | | | "type": "100"
|
| | | | | },
|
| | | | | {
|
| | | | | "props": [
|
| | | | | "_dst",
|
| | | | | "_type",
|
| | | | | "_rank"
|
| | | | | ],
|
| | | | | "type": "101"
|
| | | | | },
|
| | | | | {
|
| | | | | "props": [
|
| | | | | "_dst",
|
| | | | | "_type",
|
| | | | | "_rank"
|
| | | | | ],
|
| | | | | "type": "102"
|
| | | | | }
|
| | | | | ]
|
| | | | | statProps:
|
| | | | | exprs:
|
| | | | | random: false
|
-----+--------------+--------------+-----------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------
| 2 | PassThrough | 1 | ver: 0, rows: 0, execTime: 1us, totalTime: 1us | outputVar: [
|
| | | | ver: 1, rows: 0, execTime: 0us, totalTime: 0us | {
|
| | | | ver: 2, rows: 0, execTime: 1us, totalTime: 1us | "colNames": [],
|
| | | | ver: 3, rows: 0, execTime: 1us, totalTime: 2us | "name": "__PassThrough_2",
|
| | | | ver: 4, rows: 0, execTime: 3us, totalTime: 3us | "type": "DATASET"
|
| | | | | }
|
| | | | | ]
|
| | | | | inputVar: __Start_1
|
-----+--------------+--------------+-----------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------
| 1 | Start | | ver: 0, rows: 0, execTime: 0us, totalTime: 8us | outputVar: [
|
| | | | ver: 1, rows: 0, execTime: 0us, totalTime: 5us | {
|
| | | | ver: 2, rows: 0, execTime: 0us, totalTime: 8us | "colNames": [],
|
| | | | ver: 3, rows: 0, execTime: 0us, totalTime: 22us | "name": "__Start_1",
|
| | | | ver: 4, rows: 0, execTime: 0us, totalTime: 12us | "type": "DATASET"
|
| | | | | }
|
| | | | | ]
|
-----+--------------+--------------+-----------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------
| 6 | BFSShortest | 5 | ver: 0, rows: 25, execTime: 56us, totalTime: 57us | outputVar: [
|
| | | | ver: 1, rows: 795, execTime: 1044us, totalTime: 1045us | {
|
| | | | ver: 2, rows: 21347, execTime: 36797us, totalTime: 36799us | "colNames": [
|
| | | | ver: 3, rows: 260414, execTime: 862565us, totalTime: 862569us | "_vid",
|
| | | | ver: 4, rows: 1994473, execTime: 9430300us, totalTime: 9430303us | "edge"
|
| | | | | ],
|
| | | | | "name": "__VAR_2",
|
| | | | | "type": "DATASET"
|
| | | | | }
|
| | | | | ]
|
| | | | | inputVar: __GetNeighbors_5
|
-----+--------------+--------------+-----------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------
| 5 | GetNeighbors | 2 | { | outputVar: [
|
| | | | ver: 0, rows: 0, execTime: 21us, totalTime: 885us | {
|
| | | | "10.0.7.140":9779 exec/total/vertices: 387(us)/816(us)/1, | "colNames": [],
|
| | | | total_rpc_time: 854(us) | "name": "__GetNeighbors_5",
|
| | | | } | "type": "DATASET"
|
| | | | { | }
|
| | | | ver: 1, rows: 0, execTime: 125us, totalTime: 2911us | ]
|
| | | | "10.0.7.139":9779 exec/total/vertices: 695(us)/1106(us)/2, | inputVar: __VAR_2
|
| | | | "10.0.7.252":9779 exec/total/vertices: 1050(us)/1485(us)/3, | space: 68
|
| | | | total_rpc_time: 2771(us) | dedup: true
|
| | | | "10.0.7.140":9779 exec/total/vertices: 1521(us)/2063(us)/6, | limit: -1
|
| | | | "10.0.7.141":9779 exec/total/vertices: 2103(us)/2716(us)/8, | filter:
|
| | | | "10.0.7.250":9779 exec/total/vertices: 462(us)/854(us)/1, | orderBy: []
|
| | | | } | src: $__VAR_2._vid
|
| | | | { | edgeTypes: []
|
| | | | ver: 2, rows: 0, execTime: 350us, totalTime: 43606us | edgeDirection: OUT_EDGE
|
| | | | "10.0.7.140":9779 exec/total/vertices: 20691(us)/22813(us)/108, | vertexProps:
|
| | | | "10.0.7.141":9779 exec/total/vertices: 23499(us)/26665(us)/111, | edgeProps: [
|
| | | | "10.0.7.251":9779 exec/total/vertices: 23178(us)/25702(us)/104, | {
|
| | | | "10.0.7.252":9779 exec/total/vertices: 24204(us)/27282(us)/102, | "props": [
|
| | | | "10.0.7.139":9779 exec/total/vertices: 40239(us)/43026(us)/119, | "_dst",
|
| | | | "10.0.7.250":9779 exec/total/vertices: 19353(us)/21076(us)/85, | "_type",
|
| | | | total_rpc_time: 43207(us) | "_rank"
|
| | | | } | ],
|
| | | | { | "type": "73"
|
| | | | ver: 3, rows: 0, execTime: 7202us, totalTime: 666955us | },
|
| | | | "10.0.7.140":9779 exec/total/vertices: 532553(us)/567365(us)/2921, | {
|
| | | | total_rpc_time: 659098(us) | "props": [
|
| | | | "10.0.7.250":9779 exec/total/vertices: 593132(us)/636220(us)/3005, | "_dst",
|
| | | | "10.0.7.139":9779 exec/total/vertices: 522896(us)/553780(us)/2904, | "_type",
|
| | | | "10.0.7.251":9779 exec/total/vertices: 567593(us)/605276(us)/2816, | "_rank"
|
| | | | "10.0.7.252":9779 exec/total/vertices: 614035(us)/655477(us)/3091, | ],
|
| | | | "10.0.7.141":9779 exec/total/vertices: 496951(us)/528559(us)/2899, | "type": "71"
|
| | | | } | },
|
| | | | { | {
|
| | | | ver: 4, rows: 0, execTime: 121064us, totalTime: 6758182us | "props": [
|
| | | | "10.0.7.140":9779 exec/total/vertices: 5748262(us)/6070125(us)/30928, | "_dst",
|
| | | | total_rpc_time: 6629750(us) | "_type",
|
| | | | "10.0.7.250":9779 exec/total/vertices: 6287544(us)/6593471(us)/30953, | "_rank"
|
| | | | "10.0.7.139":9779 exec/total/vertices: 5463897(us)/5818753(us)/30693, | ],
|
| | | | "10.0.7.251":9779 exec/total/vertices: 6045649(us)/6386320(us)/30646, | "type": "72"
|
| | | | "10.0.7.252":9779 exec/total/vertices: 6067430(us)/6396783(us)/30709, | },
|
| | | | "10.0.7.141":9779 exec/total/vertices: 5263372(us)/5566007(us)/30555, | {
|
| | | | } | "props": [
|
| | | | | "_dst",
|
| | | | | "_type",
|
| | | | | "_rank"
|
| | | | | ],
|
| | | | | "type": "99"
|
| | | | | },
|
| | | | | {
|
| | | | | "props": [
|
| | | | | "_dst",
|
| | | | | "_type",
|
| | | | | "_rank"
|
| | | | | ],
|
| | | | | "type": "100"
|
| | | | | },
|
| | | | | {
|
| | | | | "props": [
|
| | | | | "_dst",
|
| | | | | "_type",
|
| | | | | "_rank"
|
| | | | | ],
|
| | | | | "type": "101"
|
| | | | | },
|
| | | | | {
|
| | | | | "props": [
|
| | | | | "_dst",
|
| | | | | "_type",
|
| | | | | "_rank"
|
| | | | | ],
|
| | | | | "type": "102"
|
| | | | | },
|
| | | | | {
|
| | | | | "props": [
|
| | | | | "_dst",
|
| | | | | "_type",
|
| | | | | "_rank"
|
| | | | | ],
|
| | | | | "type": "-73"
|
| | | | | },
|
| | | | | {
|
| | | | | "props": [
|
| | | | | "_dst",
|
| | | | | "_type",
|
| | | | | "_rank"
|
| | | | | ],
|
| | | | | "type": "-71"
|
| | | | | },
|
| | | | | {
|
| | | | | "props": [
|
| | | | | "_dst",
|
| | | | | "_type",
|
| | | | | "_rank"
|
| | | | | ],
|
| | | | | "type": "-72"
|
| | | | | },
|
| | | | | {
|
| | | | | "props": [
|
| | | | | "_dst",
|
| | | | | "_type",
|
| | | | | "_rank"
|
| | | | | ],
|
| | | | | "type": "-99"
|
| | | | | },
|
| | | | | {
|
| | | | | "props": [
|
| | | | | "_dst",
|
| | | | | "_type",
|
| | | | | "_rank"
|
| | | | | ],
|
| | | | | "type": "-100"
|
| | | | | },
|
| | | | | {
|
| | | | | "props": [
|
| | | | | "_dst",
|
| | | | | "_type",
|
| | | | | "_rank"
|
| | | | | ],
|
| | | | | "type": "-101"
|
| | | | | },
|
| | | | | {
|
| | | | | "props": [
|
| | | | | "_dst",
|
| | | | | "_type",
|
| | | | | "_rank"
|
| | | | | ],
|
| | | | | "type": "-102"
|
| | | | | }
|
| | | | | ]
|
| | | | | statProps:
|
| | | | | exprs:
|
| | | | | random: false
|
-----+--------------+--------------+-----------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------
| 0 | Start | | ver: 0, rows: 0, execTime: 0us, totalTime: 10us | outputVar: [
|
| | | | | {
|
| | | | | "colNames": [],
|
| | | | | "name": "__Start_0",
|
| | | | | "type": "DATASET"
|
| | | | | }
|
| | | | | ]
|
-----+--------------+--------------+-----------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------
Wed, 27 Oct 2021 14:50:07 CST
多谢,目前感觉可以优化的点有两个
1、 第一个bfs_6算子 ver: 4, rows: 1994473, execTime: 9430300us, totalTime: 9430303us, 处理2百万数据大概用了快9s, 主要问题是目前 算子内部使用了hash过滤,但是没有在初始化的时候reserve哈希表大小,造成频繁rehash,
2、 getNeighbor算子, ver: 0, rows: 0, execTime: 41us, totalTime: 610us, 其中execTime 是storage执行的时间, totalTime是 graph发送请求到graph接到结果的时间,中间包含系列化和网络传输的耗时,其中序列化和网络传输耗时占比略大
我看了下,其中一个5跳之后 2百万点,另一个只有52点, 这两个之间最终是没有最短路径的。
我不知道自己对这个FIND PATH理解是否正确:
我的理解现在是两边各BFS 5 跳,然后看结果集合。 但是因为有一个点比较大,BFS 比较费时,是不是可以让小点继续BFS, 也许小点已经BFS 10跳,但是大点才BFS 3跳?这样会不会快一些
非常好的想法,可以提个issue 记录一下
此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。