【问题标题】:AQL Upsert performance ArangoDB with python-arangoAQL Upsert 性能 ArangoDB 与 python-arango
【发布时间】:2021-08-24 18:24:23
【问题描述】:

我正在使用 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 是异步工作的。总共大约 45 秒 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-Backend 的速度非常慢,并且在短时间内甚至无法访问。

我很好奇:为什么一个单独的(好吧,我使用了 2、10、50、100 个项目但没有效果的批次)aql 语句与 FOR 比 27k 单独请求慢得多?我预计不是这样。有没有更好的方法一次执行多个 UPSERT(使用 Python)?

它是一个具有 2 个内核和 16 GB RAM 的 Windows 系统。阅读成绩不错,但写作……

【问题讨论】:

    标签: python arangodb python-arango


    【解决方案1】:

    UPSERT 执行嵌套查询以查找匹配的文档。但是,这并不能解释为什么单个查询的性能比多个查询差得多,除非您当然异步/并行执行这些查询。我将不得不更详细地研究这一点。

    但是,由于您使用_key 来标识您的文档,并且您的INSERTUPDATE 语句看起来相同,因此您最好使用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' }"
    

    但是在处理大量文档时,您应该考虑使用批量文档创建 (https://www.arangodb.com/docs/stable/http/document-working-with-documents.html#create-multiple-documents),它也支持 overwriteMode。不过不知道python-arango驱动是否支持这些功能。

    【讨论】:

    • 我想加入同一个item不同属性的两个数据源。是否会覆盖不删除现有条目?
    • 你看过文档了吗?当您将overwriteMode 设置为“更新”时,文档不会被替换,而是更新 - 就像更新操作一样。所以实际上,这将是一个“更新或插入”。
    猜你喜欢
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多