【问题标题】:Azure CosmosDB Graph traversal performance issueAzure CosmosDB Graph 遍历性能问题
【发布时间】:2017-09-29 09:22:29
【问题描述】:

将银行账户上的简单交易想象为图形数据库。像这样的事件:

  1. +$1000 现金投入。
  2. -10 美元 通过 VISA 购买一本书。
  3. +100 美元 出售旧自行车的现金。
  4. -50 美元 购买杂货的现金。

在图结构中,我们可以将节点定义为具有以下属性的事务

  • id - 交易 ID
  • time - 交易发生时间的时间戳。
  • delta - 交易中使用的金额 (+/-)
  • 描述 - 交易原因。

边将指向上一个事务。我们可以让其他边指向其他账户(用于账户之间的转账)、所有者等,但为简单起见,我们有这种结构。

    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

对于 4 次交易来说,这一切都很好而且很快。但是,为 100 000 个事务执行此操作时,大约需要 8 分钟,而对于更复杂的操作或更多数据,则需要更长的时间。

在我的测试用例中,我设置了一个带有 Graph API 的 Azure Cosmos-DB,吞吐量为 2000 RU/s。

由于我对 Graph 数据库和查询还很陌生,我意识到可能有更快更好的方法来做到这一点,以及优化这一点的方法,我不知道。也许甚至图形数据库也不是这项工作的正确工具?

我想在这里实现的是对交易的合理快速查询,这可能会分叉到多个账户和更多事件。

我怎样才能更好地完成这项工作?

【问题讨论】:

    标签: graph-databases gremlin azure-cosmosdb tinkerpop azure-ad-graph-api


    【解决方案1】:

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

    请记住,在 OLTP 查询中包含如此多的跃点通常是个坏主意。

    【讨论】:

    • 您好,感谢您的回答。事实上,这可能是一个解决方案,但有更复杂的查询不适用于这样的解决方案。兑现结果是我们正在考虑的事情,但首先我想确定限制。您认为 OLTP 查询中合理的跳数是多少?我们可以做些什么来提高这种遍历速度?
    • 我不确定在 Cosmos-DB 中是如何处理的,但我假设每个跃点都会触发一个新的后端查询,因此它会很快加起来。如果我只需要抛出一个数字,我会说保持在 50 以下(并且分支因子非常低,在您的用例中就是这种情况)。但这只是疯狂的猜测,您最好自己尝试一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 2021-04-09
    • 1970-01-01
    相关资源
    最近更新 更多