Neo4j查询显示时长与实际不符,如何获取正确输出时长?
Neo4j查询时长显示不符的解决办法
问题原因
Neo4j控制台输出的Started streaming 523565 records after 1 ms and completed after 3079 ms, displaying first 1000 rows里的时间,仅代表服务器端完成查询执行并开始返回结果流的耗时,不包含后续所有结果数据传输到客户端、客户端接收/渲染的时间。当结果集规模较大(如52万条记录)时,这部分传输和处理的时间会占据总耗时的绝大部分,导致实际总耗时远超显示的数字。
解决方法
用APOC工具直接获取完整耗时
借助Neo4j的APOC扩展库,用apoc.util.measure函数包裹目标查询,它会等待所有结果处理完成后返回完整耗时:CALL apoc.util.measure("MATCH (n) RETURN n LIMIT 523565", {}) YIELD duration, result RETURN duration, count(result)返回的
duration字段就是查询从开始到所有结果处理完毕的总耗时。命令行下用系统计时工具
如果使用cypher-shell执行查询,直接用系统自带的计时命令包裹,能得到从命令启动到结束的完整耗时(含服务器执行、数据传输、客户端处理):# Linux/macOS time cypher-shell -u 用户名 -p 密码 "MATCH (n) RETURN n LIMIT 523565" # Windows PowerShell Measure-Command { cypher-shell -u 用户名 -p 密码 "MATCH (n) RETURN n LIMIT 523565" }通过查询日志获取准确时长
修改Neo4j配置文件neo4j.conf,开启详细查询日志:dbms.logs.query.enabled=true dbms.logs.query.level=INFO重启Neo4j后,执行目标查询,然后在
query.log日志文件中找到对应查询条目,其中的totalTime字段记录了从查询开始到结果全部发送完成的完整耗时。通过JMX监控查看实时指标
执行查询时或完成后,调用Neo4j的JMX查询命令查看完整耗时:CALL dbms.queryJmx("org.neo4j:name=Query,name=*") YIELD attributes RETURN attributes.queryText, attributes.elapsedTime找到对应查询的
elapsedTime,就是从查询启动到当前的累计耗时(执行完成后就是总耗时)。
内容的提问来源于stack exchange,提问作者Gqueee
相关产品推荐
相关产品推荐

