ArangoDB查询缓慢

3

我是ArangoDB的新手,正在努力优化我的查询,并希望得到一些帮助。

下面提供的查询是我正在苦苦挣扎的一个真实例子,在我的开发数据库上需要 758.078 毫秒,但在具有更大数据集的暂存库中需要 531.511 秒

我还将提供我在开发和暂存中遍历的每个边缘表的大小。非常感谢任何帮助。

for doc in document
filter repo._key == "my-key"
    for v, e, p in 3 any doc edge1, edge2, edge3
    options {uniqueVertices: 'global', bfs: true}
    filter DATE_ISO8601(p.vertices[2].date) > DATE_ISO8601("2017-09-04T00:00:01Z")
        and DATE_ISO8601(p.vertices[2].date) < DATE_ISO8601("2017-09-15T23:59:59Z")
    limit 1
    return {
        commit: p.vertices[2].hash,
        date: p.vertices[2].date,
        message: p.vertices[2].message,
        author: p.vertices[1].email,
        loc: p.vertices[3].stats.additions
    }

DEV

  • 边缘1: 2,638
  • 边缘2: 2,560
  • 边缘3: 386

STAGING

  • 边缘1: 5,438,811
  • 边缘2: 5,544,028
  • 边缘3: 423,545
2个回答

2

查询可能很慢,因为过滤条件

filter 
  DATE_ISO8601(p.vertices[2].date) > DATE_ISO8601("2017-09-04T00:00:01Z"
and 
  DATE_ISO8601(p.vertices[2].date) < DATE_ISO8601("2017-09-15T23:59:59Z")

此过滤器未在遍历期间应用,而仅在之后应用。 可能是由于在过滤条件中调用了函数(DATE_ISO8601)。如果您的日期值存储为数字,可以检查以下过滤条件是否加速查询:

filter 
  p.vertices[2].date > DATE_TIMESTAMP("2017-09-04T00:00:01Z"
and 
  p.vertices[2].date < DATE_TIMESTAMP("2017-09-15T23:59:59Z")

修改后的过滤条件应该允许将过滤条件置于遍历内部,以便更早地执行。

您可以在ArangoShell中使用db._explain(<query string goes here>);或从Web界面的AQL编辑器中验证查询执行计划。


{btsdaf} - Shane Da Silva
1
我认为你可以用我提出的条件替换你的过滤条件。但前提是你的日期值以数字形式存储。 然后,你可以使用Web界面检查查询的执行计划。执行计划应该会发生变化,底部的“遍历”部分应该会显示过滤条件。而在原始查询中,“遍历”部分不应该显示过滤条件。 - stj

0

可能有点晚了,但这会对某些人有所帮助。使用DATE函数将使查询速度变慢,因此如果可能,请删除DATE函数。例如 enter image description hereenter image description here

您可以看到查询过滤器命令使用了一个大约为7秒的日期函数。如果不使用日期函数,则运行速度将快于大约0.5秒。这两行将查询2018-09-29的数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接