【问题标题】:Batch Deletion datastax c#批量删除datastax c#
【发布时间】:2020-09-27 09:59:16
【问题描述】:

我对 Cassandra 数据库很陌生。我有一个关于使用 cassandra 的问题。

表结构如下:-

表名称:- 产品详细信息。

ProductFamily 文本,

访问组文本,

产品详情图

((ProductFamily), AccessGroup) 主键

数据关系:-

对于 1 个产品系列,我们有多个访问组,每个访问组在 Map 中都有产品详细信息。很可能 1 个产品详细信息存在于所有访问组或某些访问组中。

场景 1:-

  1. 我们收到一个仅包含 ProductId 和产品系列的删除事件。

我们的实现:-

  1. 从数据库中获取产品系列的所有访问组。

  2. 对于每个访问组,点击数据库获取地图,然后我们检查它是否有特定的productid作为地图键。

  3. 如果是,则将该 accessgroup -> productid (key,value) 对保存在内存中。

  4. 最后,准备批处理语句删除访问组的所有产品id,因为我们的分区键相同。

注意 - 最大。我们在一个地图中有 15-20 个项目和一个产品系列的 8-10 个访问组。

.

问题:-

  1. 能否告诉我我是否遵循了正确的批量删除方法?

  2. 如果我们在一天内收到数千个此类事件,这种方法是否有效?

提前致谢。

【问题讨论】:

  • “点击数据库获取地图”是什么意思?您是否为同一张表发送另一个选择语句?您可以选择第一个查询中的所有列来避免这种情况
  • 是的,另一个选择语句为每个产品系列和访问组获取地图。在第一个选择中,我们只获取 2 列(产品系列和访问组)
  • 您可以测试与单个查询相比,该方法是否具有更好的结果以获取所有 3 列。

标签: c# datastax-enterprise cassandra-3.0


【解决方案1】:

一般来说,如果目标是提高性能,我们不建议使用批处理。但是,当批处理中的所有语句都引用相同的分区键(相对于发送单独的异步请求)时,一些用户报告了性能改进,因此您的方法实际上可能是提供最佳性能的方法。

可能会损害性能的一件事是这种方法的“尖峰”性质。 Cassandra 节点做这样的事情可能会更好:

  1. 从数据库中获取产品系列的所有访问组。

  2. 对于每个访问组,点击数据库获取地图,然后我们 检查它是否有特定的 productid 作为映射键。

  3. 如果是,则异步发送 DELETE 请求并将Task 保存在内存中(无需立即等待)。

  4. 最后,等待所有保存在内存中的任务,await Task.WhenAll(tasks)

虽然不能保证这种方法会更好,但性能测试和基准测试是确定这一点的唯一方法。

【讨论】:

  • 在这种方法中,您只是摆脱了批处理,而无论我在内存中保存什么,您都在创建这些东西的任务。有点混淆它有什么不同。我的印象是,如果分区键相同,那么批处理是 Cassandra 中的正确选择。
  • 是的,我提到您的方法可能是最好的方法,如果您想进行一些基准测试并找出最有效的方法,我建议使用此替代方法。如果没有基准/性能测试,您将永远无法确定哪种方法更适合您的用例。
  • 不同之处在于,当您发送一个大小合适的批次时,它会在 cassandra 协调器节点上投入更多工作,但可能这些额外工作并不是很相关,因为每个语句都有相同的分区键。对于每个用例都没有完美的解决方案,因此了解一种方法是否更好的唯一方法就是对其进行测试。
  • True...性能测试。谢谢
猜你喜欢
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 2015-01-18
  • 1970-01-01
  • 2023-03-08
  • 2010-12-18
  • 2016-01-22
  • 2019-08-09
相关资源
最近更新 更多