我正在使用paython-arango和aql查询对多个项目(大约20 - 30k)的UPSERT语句进行实验。总的来说,与NodeJS相比,python中的这种方法似乎要慢得多,但我尝试了两种不同的方法,令人惊讶的是,我认为它的速度要慢得多,我试图理解为什么。
我最初的方法是用下面这样的语句分别插入每一项:
aql = "UPSERT {_key: '" + data["_key"] + "'}"
aql += " INSERT " + doc
aql += " UPDATE " + doc
aql += " IN " + col_name
self.db.aql.execute(aql)正如我之前所说的,这比NodeJS中类似的NodeJS脚本要慢,可能是因为NodeJS异步工作。总共约45s für 27k个条目(2.4 MB csv-dump)。对于如此少的数据,需要大量的时间。
然后我想,一个接一个地可能是问题所在,最好是每个查询发送多个项目到数据库,如下所示:
aql = "FOR itm IN " + json.dumps(items)
aql += " UPSERT {_key: itm._key}"
aql += " INSERT itm"
aql += " UPDATE itm"
aql += " IN " + col_name但实际上,这是更糟糕的。可能需要5分钟,ArangoDB后端非常慢,而且在很短的一段时间内甚至无法访问。
我很好奇:为什么一个单独的(好的,我使用了2,10,50,100个项目的批次,但没有效果)的aql-statement with FOR比27k单独的请求要慢得多?我想不是这样的。有没有更好的方法来一次执行多个UPSERT(使用Python)?
它是一个Windows系统,有2个内核和16 GB的RAM。阅读表现很好,但写作...
发布于 2021-06-08 20:33:50
UPSERT执行嵌套查询以查找匹配的文档。然而,这并不能解释为什么单个查询的性能比多个查询差得多,当然,除非您异步/并行地执行这些查询。我将不得不更详细地研究这一点。
但是,由于您使用_key来标识文档,并且INSERT和UPDATE语句看起来完全相同,因此最好将overwriteMode用于INSERT (请参阅https://www.arangodb.com/docs/stable/aql/operations-insert.html#query-options):
aql = "FOR itm IN " + json.dumps(items)
aql += " INSERT itm"
aql += " IN " + col_name
aql += " OPTIONS { overwriteMode: 'update' }"但是,在处理大量文档时,您应该考虑使用同样支持overwriteMode的批量文档创建(https://www.arangodb.com/docs/stable/http/document-working-with-documents.html#create-multiple-documents)。但是,我不知道python-arango驱动程序是否支持这些函数。
https://stackoverflow.com/questions/67875501
复制相似问题