簡體   English   中英

如何解決ArangoDB Foxx死鎖問題?

[英]How to resolve ArangoDB Foxx deadlocking problems?

在測試中,我們的Foxx應用正在陷入“檢測到死鎖”的問題。 這些似乎是由遍歷查詢引起的。 先驗的,很難甚至不是不可能知道遍歷期間將使用哪些表。 但是,我確實采用了一種特定的情況,即可以確定表的數量並將AQL包裝在用於測試的事務中:

var result = db._executeTransaction({“ collections”:{“ read”:[“ pmlibrary”,“ pmvartype”,“ pmvariant”,“ pmproject”,“ pmsite”,“ pmpath”,“ pmattic”]},“操作“:” function(){var db = require(\\“ @ arangodb \\”)。db; var res = db._query(\\“ FOR o IN ['pmlibrary / 199340787'] FOR v,e,p IN 0。 .7 INBOUND o pm_child返回p.vertices \\“);返回res.toArray()}”});

僅供參考,集合中的表列表不包括邊緣表。

但是,此語句上的僵局仍在繼續。 我不確定接下來要嘗試什么。 謝謝。

我不是ArangoDB的索引/性能專家,但最近我也遇到了一些死鎖問題,通過重構和重塑查詢可以顯着提高性能,有時查詢花費120秒,然后花費0.2秒。

我做的關鍵一件事是嘗試幫助ArangoDB知道何時使用索引,並確保要使用該索引。

在您的示例查詢中,有一個問題使ArangoDB無法知道發生了索引:

FOR o IN ['pmlibrary/199340787'] 
FOR v,e,p IN 0..7 INBOUND o pm_child 
  RETURN p.vertices

與此相關的關鍵問題是,原始的FOR循環正在使用數組中的值,這可能會阻止ArangoDB標識索引。 您可以輕松地用參數替換o,然后直接輸入'pmlibrary/199340787'值,並使用Explain按鈕查看它是否標識它可以使用索引。

我發現的一個問題是試圖使使用索引變得非常清晰,這有時意味着添加其他LET命令以允許ArangoDB構建數組的內容,然后似乎知道使用哪種索引更好。

如果要測試上述查詢的性能,則需要執行以下操作:

LET my_targets = (FOR o IN pmlibrary FILTER o._key == '199340787' RETURN o._id)

FOR o IN my_targets
FOR v,e,p IN 0..7 INBOUND o._id pm_child 
  RETURN p.vertices

似乎反直觀,但是通過測試,我發現通過將查詢分開來幫助ArangoDB注意到它可以使用索引,從而獲得了驚人的性能提升。

如果有任何查詢針對數組中的值,或者您正在使用動態屬性名稱,那么即使存在索引,它也不會始終使用索引。

我還發現服務器將緩存查詢的響應,因此,如果您要測試對長期運行的查詢所做的更改,並希望避免第二個+查詢上的緩存命中,我必須停止並重新啟動arangodb3服務。

我希望這可以為您提供一個針對查詢進行改組以使用索引的目標。

請記住,您已經在_id,_key,_from,_to上建立了內置索引,因此您需要嘗試確保它將使用其他有助於加快查詢速度的索引。

正確的解決方案是使用WITH子句而不是事務。

暫無
暫無

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

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