【发布时间】:2015-12-15 21:05:06
【问题描述】:
我有一个包含超过 1500 万份文档的集合。在这 1500 万份文档中,我每小时更新 2 万条记录。但是更新查询需要很长时间才能完成(大约 30 分钟)。
文档:
{ "inst" : "instance1", "dt": "2015-12-12T00:00:000Z", "count": 10}
我有一个包含 20k 个要更新的实例的数组。
我的查询如下所示:
For h in hourly filter h.dt == DATE_ISO8601(14501160000000)
For i in instArr
filter i.inst == h.inst
update h with {"inst":i.inst, "dt":i.dt, "count":i.count} in hourly
有没有优化的方法来做到这一点。我在 inst 上有哈希索引,在 dt 上有 skiplist 索引。
更新
我无法在查询中手动使用 20k inst,因此以下是仅 2 inst 的执行计划:
FOR r in hourly FILTER r.dt == DATE_ISO8601(1450116000000) FOR i IN
[{"inst":"0e649fa22bcc5200d7c40f3505da153b", "dt":"2015-12-14T18:00:00.000Z"}, {}] FILTER i.inst ==
r.inst UPDATE r with {"inst":i.inst, "dt": i.dt, "max":i.max, "min":i.min, "sum":i.sum, "avg":i.avg,
"samples":i.samples} in hourly OPTIONS { ignoreErrors: true } RETURN NEW.inst
Execution plan:
Id NodeType Est. Comment
1 SingletonNode 1 * ROOT
5 CalculationNode 1 - LET #6 = [ { "inst" : "0e649fa22bcc5200d7c40f3505da153b", "dt" : "2015-12-14T18:00:00.000Z" }, { } ] /* json expression */ /* const assignment */
13 IndexRangeNode 103067 - FOR r IN hourly /* skiplist index scan */
6 EnumerateListNode 206134 - FOR i IN #6 /* list iteration */
7 CalculationNode 206134 - LET #8 = i.`inst` == r.`inst` /* simple expression */ /* collections used: r : hourly */
8 FilterNode 206134 - FILTER #8
9 CalculationNode 206134 - LET #10 = { "inst" : i.`inst`, "dt" : i.`dt`, "max" : i.`max`, "min" : i.`min`, "sum" : i.`sum`, "avg" : i.`avg`, "samples" : i.`samples` } /* simple expression */
10 UpdateNode 206134 - UPDATE r WITH #10 IN hourly
11 CalculationNode 206134 - LET #12 = $NEW.`inst` /* attribute expression */
12 ReturnNode 206134 - RETURN #12
Indexes used:
Id Type Collection Unique Sparse Selectivity Est. Fields Ranges
13 skiplist hourly false false n/a `dt` [ `dt` == "2015-12-14T18:00:00.000Z" ]
Optimization rules applied:
Id RuleName
1 move-calculations-up
2 move-filters-up
3 move-calculations-up-2
4 move-filters-up-2
5 remove-data-modification-out-variables
6 use-index-range
7 remove-filter-covered-by-index
Write query options:
Option Value
ignoreErrors true
waitForSync false
nullMeansRemove false
mergeObjects true
ignoreDocumentNotFound false
readCompleteInput true
【问题讨论】:
-
我猜
instArr是提到的具有 20k 个实例的数组?查询开始时是否知道数组值?或者它是在查询中的某个地方计算的并且没有显示?数组值是否唯一?执行计划是否显示查询使用索引? -
instArr 在查询开始之前是已知的。它是唯一值数组,长度为 20k。我正在使用 arangodb 2.5.7 并且无法从中升级。我没有尝试执行计划。大多数关于执行计划的文档都是最新版本的。不确定在 2.5.7 中运行哪个命令来执行计划。
-
可以通过 ArangoShell 中的
require("org/arangodb/aql/explainer").explain(queryString);检索查询的执行计划。如果查询中有绑定参数,可以使用require("org/arangodb/aql/explainer").explain({ query: queryString, bindVars: bindVars });。这对于 2.5 和更新的版本应该是相同的。 -
我用执行计划编辑了帖子。
-
答案是否满足您的需求?如果,您介意将其标记为已接受吗?否则,缺少什么?
标签: arangodb