0

试想在银行帐户上作为一个图形数据库简单的交易。有了这样的活动:天青CosmosDB图的遍历性能问题

  1. + $ 1000个现金投入。
  2. - $ 10用VISA购买一本书。
  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分钟,并用更复杂的操作或更多的数据需要花费更长的时间。

在我的测试情况下,我已经设置了一个蓝色的宇宙-DB与图形API和吞吐量2000 RU /秒。

因为我是相当新的图形数据库和查询,我意识到有可能是这样做的更快,更好的方式,以及如何优化这一点,我不知道。也许甚至图形数据库不是这份工作的正确工具?

我想在这里实现什么是合理的快速查询到的交易,可叉多个账户,还有更多的事件。

如何让这项工作更好?

回答

3

为什么不为每个事务顶点添加一个current属性?这样仍然可以保持现在的历史记录,同时还可以更快地访问当前库存值(在任何给定的时间点)。另外,如果任何事务的值随后发生变化,则相应地更新所有较新的事务将很容易(但这只会是一个长时间运行的写查询,读取仍然会很快)。

请记住,在OLTP查询中拥有如此之多的跳数通常是一个糟糕的主意。

+0

嗨,谢谢你的回答。事实上,这可能是一个解决方案,但有更复杂的查询,这种解决方案不会很好地工作。兑现结果是我们正在考虑的事情,但首先我想确定这些限制。你会说什么是在OLTP查询中合理的跳数?我们能做些什么来改善这种遍历速度吗? – ifxdev

+0

我不确定这是如何在Cosmos-DB中处理的,但我认为每一跳都会触发一个新的后端查询,因此它会快速累加起来。如果我不得不抛出一个数字,我会说保持在50以下(并且分支因数很低,这在你的用例中就是这种情况)。但这只是猜测,你应该更好地尝试一下。 –