0

グラフデータベースとして銀行口座に単純なトランザクションを想定します。Azure CosmosDBグラフのトラバーサルパフォーマンスの問題

  1. + $ 1000現金入力:このようなイベントでは。
  2. - $ 10VISAで本を購入された場合。
  3. + $ 100古いバイクを販売するための現金。
  4. - $ 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をセットアップしました。

グラフのデータベースとクエリがかなり新しくなって以来、私はこのことをもっと速く、よりうまくやり遂げる方法と、これを最適化する方法についてはわかっていません。たぶん、グラフデータベースでさえ、この仕事のための正しいツールではありませんか?

私がここで達成したいのは、トランザクションへの妥当な高速クエリであり、複数のアカウントに分岐する可能性があります。

この作業を改善するにはどうすればよいですか?

答えて

3

トランザクションの頂点ごとにcurrentプロパティを追加するだけでいいのですか?これにより、今のところ履歴が保持されますが、現在のインベントリ値(任意の時点で)へのアクセスがさらに高速になります。また、その後のトランザクションの値が変更された場合は、それに応じてすべての新しいトランザクションを簡単に更新できます(ただし、これは長時間実行される書き込みクエリのみで、読み取りはまだまだ高速です)。

OLTPクエリでは多くのホップを持つことは一般的には悪い考えです。

+0

こんにちは、あなたの答えに感謝します。確かにこれは解決策かもしれませんが、そのような解決策ではうまくいかない複雑なクエリがあります。結果をキャッシングすることは私たちが検討していることですが、まずはその限界を決めたいと思います。あなたは、OLTPクエリーのホップ数はどれほど妥当であると思いますか?このトラバーサルスピードを改善するためにできることはありますか? – ifxdev

+0

これはCosmos-DBでどのように処理されているのか分かりませんが、各ホップが新しいバックエンドクエリをトリガーするため、すぐに追加されます。私が数字を捨てなければならないのであれば、私は50より下にとどまると言いたいと思います(そして、あなたのユースケースでは非常に低い分岐ファクタです)。しかし、それはただの野生の推測であり、自分で試してみるべきものです。 –

関連する問題