グラフデータベースとして銀行口座に単純なトランザクションを想定します。Azure CosmosDBグラフのトラバーサルパフォーマンスの問題
- + $ 1000現金入力:このようなイベントでは。
- - $ 10VISAで本を購入された場合。
- + $ 100古いバイクを販売するための現金。
- - $ 50買物用現金。グラフ構造で
我々はトランザクションとしてのノードを定義することができますプロパティを持つ:
- ID - トランザクションID
- 時間 - トランザクションが起こったときのタイムスタンプ。
- デルタ - 使用金額(+/-)取引上の
- 説明 - トランザクションの理由。
エッジは、以前のトランザクショントランザクションを指していました。他の口座(口座間の振替)、所有者などを指す他のエッジを持つこともできますが、簡単にするためにこの構造を使用しています。今
g.addV('transactions').property('id','1').property('time',0).property('delta',1000).property('description','cash input')
g.addV('transactions').property('id','2').property('time',1).property('delta,-10).property('description','for buying a book by VISA')
g.V('2').addE('previous').to(g.V('1'))
g.addV('transactions').property('id','3').property('time',2).property('delta',100).property('description','cash for selling an old bike.')
g.V('3').addE('previous').to(g.V('2'))
g.addV('transactions').property('id','4').property('time',3).property('delta',-50).property('description','cash for buying groceries')
g.V('4').addE('previous').to(g.V('3'))
はこのように、特定の日付まで、または初めに、私たちは、最新のトランザクションから
以前エッジを横断します。このアカウントの現在の在庫を取得するには:
g.V('4').emit().repeat(out('previous')).until(has('time',0)).properties('delta').value().sum()
すべてのために良いと高速です> 1040
==トランザクション。しかし、のトランザクションでこれを実行すると、約8分かかります。複雑な操作やデータでは、それ以上の時間がかかります。
私のテストケースでは、グラフAPIとスループット2000 RU/sのAzure Cosmos-DBをセットアップしました。
グラフのデータベースとクエリがかなり新しくなって以来、私はこのことをもっと速く、よりうまくやり遂げる方法と、これを最適化する方法についてはわかっていません。たぶん、グラフデータベースでさえ、この仕事のための正しいツールではありませんか?
私がここで達成したいのは、トランザクションへの妥当な高速クエリであり、複数のアカウントに分岐する可能性があります。
この作業を改善するにはどうすればよいですか?
こんにちは、あなたの答えに感謝します。確かにこれは解決策かもしれませんが、そのような解決策ではうまくいかない複雑なクエリがあります。結果をキャッシングすることは私たちが検討していることですが、まずはその限界を決めたいと思います。あなたは、OLTPクエリーのホップ数はどれほど妥当であると思いますか?このトラバーサルスピードを改善するためにできることはありますか? – ifxdev
これはCosmos-DBでどのように処理されているのか分かりませんが、各ホップが新しいバックエンドクエリをトリガーするため、すぐに追加されます。私が数字を捨てなければならないのであれば、私は50より下にとどまると言いたいと思います(そして、あなたのユースケースでは非常に低い分岐ファクタです)。しかし、それはただの野生の推測であり、自分で試してみるべきものです。 –