簡體   English   中英

AQL Upsert 性能 ArangoDB 與 python-arango

[英]AQL Upsert performance ArangoDB with python-arango

我正在使用 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 系統。 閱讀成績不錯,但寫作...

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驅動是否支持這些功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM