`BoltStatementResultSummary` 中的 `result_available_after` 和 `result_consumed_after` 有什么区别?如何测量查询执行时间?

What is difference between `result_available_after` and `result_consumed_after` in `BoltStatementResultSummary`? How to measure query execution time?

我尝试从文档中理解 here,引用文档

result_available_after = None The time it took for the server to have the result available.

result_consumed_after = None The time it took for the server to consume the result.

我还是不明白实际的区别。 如果我想扩展程序并找到查询的执行时间,我应该考虑哪一个。如果我再次 运行 同样的查询,为什么 result_available_after 会变成 0 ms?是缓存的原因吗?我尝试按照 here 的建议更改设置 dbms.memory.pagecache.size=1M,但没有成功。我怎样才能只测量查询的执行时间?

我正在使用 Neo4j 4.0 和 neo4j python 驱动程序进行查询。

result_available_after 是第一个结果被发现并可用之前的时间。可能还有更多的结果需要从查询中找到和流式传输,但这是合理的,客户端可以开始将结果流式传输回来。

result_consumed_after 是所有结果被找到并被/发送给进行查询的客户端的时间。至此查询完全结束。

至于看到 result_available_after 变为 0,这可能是两件事的结合:

  1. 由于之前只是运行查询,查询已经被缓存,所以后续执行不需要编译和规划,只是从缓存中获取规划并执行。这会排除编译和计划时间。

  2. 如果查询是针对相同的数据,那么图形中接触和检索的部分现在应该在页面缓存中。在随后的执行中,遍历会更快,因为对于遍历它只需要命中页面缓存。所以这会排除磁盘 I/O。这就是为什么最好有足够的 RAM 以允许将页面缓存配置为覆盖尽可能多的图形,以避免磁盘成本 I/O.