2017-04-04 13 views
1

テスト中、Foxxアプリケーションが「デッドロックが検出されました」という問題に陥っています。これらは、トラバーサルクエリによって引き起こされるようです。 Aprioriでは、トラバース中にどのテーブルが使用されるかを知ることは不可能ではないにしても困難です。しかし、私はテーブルの数を決定し、テストのためのトランザクションでAQLをラップする特定のケースを取った。ArangoDB Foxxデッドロック問題を解決するには?

var result = db._executeTransaction({"read":["pmlibrary "、" pmvartype "、" pmvariant "、" pmproject "、" pmsite "、" pmpath "、" pmattic "]}、" action ":" function(){var db = require(\ "@ arangodb \") db; var res = db._query(\ "pmlibrary/199340787 '] FOR v、e、p IN 0..7 INBOUND pm_child RETURN p.vertices \"); return res.toArray()} "});

FYIでは、コレクション内のテーブルのリストにはエッジテーブルが含まれていません。

ただし、このステートメントのデッドロックは続行されます。私は次に何を試すべきか分かりません。ありがとう。

答えて

1

適切な解決策は、トランザクションではなくWITH句を使用することでした。

1

私はArangoDBの索引付け/パフォーマンスの専門家ではありませんが、最近はデッドロックの問題もありました。また、再構成と再構成によってパフォーマンスが大幅に向上しました。

私がした重要なことは、ArangoDBがいつインデックスを使用するかを知り、そのインデックスが使用されることを確認することでした。あなたの例のクエリで

は、インデックスを知っているからArangoDBを停止する問題が発生している:

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

これで重要な問題は、ループのためにあなたの元には、配列から値を使用しているされていることですArangoDBが索引を識別するのを妨げる可能性があります。 oをパラメータに簡単に置き換えて、'pmlibrary/199340787'の値を直接入力し、Explainボタンを押してインデックスを使用できるかどうかを確認します。

私は、ArangoDBが配列の内容を構築できるように追加のLETコマンドを追加することを意味するインデックスを使用することを非常に明確にしようとしていました。

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がそれに気づく助けるために離れてクエリを壊すことによって、驚くべきパフォーマンスの向上が見つかりました:あなたは上記のクエリのパフォーマンスをテストした場合、何か対

インデックスを使用できます。

配列内の値に対するクエリがある場合、または動的属性名を使用している場合は、インデックスが存在する場合でも常にインデックスを使用するとは限りません。

また、サーバがクエリのレスポンスをキャッシュするので、長期実行クエリの変更をテストし、2回目のクエリでキャッシュヒットを避けたい場合は、arangodb3サービスを停止して再起動する必要がありました。

インデックスを扱うためにクエリをシャッフルするためのターゲットを与えるのに役立つことを望みます。

_id、_key、_from、_toにはすでに索引が組み込まれていることを覚えておいてください。クエリの高速化に役立つ他の索引を使用するようにしてください。

+0

David、 ありがとうございました。私の場合、配列内に複数の項目があり、それらは異なるコレクションに存在する可能性があります。 デッドロックエラーが2回発生していました。私は、AQLステートメントがお互いに対戦していると考えましたが、同じAQLステートメントの同時呼び出しでなければならないことが判明しました。 QAテスターは、私が実際にWITH句を使用して最初に修正したことを教えてくれませんでした。私は何かを逃したと思った。両方のステートメントでWITH句を使用すると、デッドロックは発生しません。 – ggendel

関連する問題