【问题标题】:Using a subset of GetHashCode() to increase AzureTable performance through partitioning使用 GetHashCode() 的子集通过分区提高 AzureTable 性能
【发布时间】:2012-11-20 16:18:47
【问题描述】:

一般来说,Azure Table IO 性能会随着使用更多分区而提高(我不会在继续令牌和批量更新方面进行一些权衡)。

由于分区键始终是一个字符串,我正在考虑使用基于分区键 GetHashCode() 的 子集 的“自然”负载平衡技术,并将此子集附加到分区钥匙本身。这将允许以很少的开销和轻松地计算所有直接 PK/RK 查询。批量更新可能只需要一个中间人在提交之前将类似的 PK 组合在一起。

问题:

  • 我应该使用GetHashCode() 来计算分区键吗?有更好的功能吗?

  • 如果我使用GetHashCode() PK 使用哪个字符有关系吗?

  • 是否有针对 Azure 表和 Blob 存储的抽象已经为我完成了这项工作?

【问题讨论】:

    标签: c# .net performance azure azure-table-storage


    【解决方案1】:

    不,不要使用GetHashCode,因为它的值只能保证在当前的 AppDomain 中是稳定的。否则,它可以随时更改。

    使用您控制的或标准化的哈希函数。为此,Google 推出了一组哈希值,包括“杂音哈希值”。

    你应该对什么进行分区(和散列)?这取决于您的查询模式。如果不查看您的查询模式,绝对无法回答。一般来说,尝试对几乎所有查询中的谓词进行分区。

    【讨论】:

    • 啊,你是对的,我记得听说我不应该将 HashCode() 保存到磁盘,现在你提到它。
    • 只是澄清一下,我不是在问什么(在我的数据集中)应该用作分区键。相反,我说我的 PK 是“SomeStudentID”。假装杂音哈希是“ASDF123”。我只想要 36 个分区。 PK 应该是 SomeStudentIDA 还是 SomeStudentID3,其中附加的字符来自杂音哈希(或类似的),但均匀一致地分布数据。因为我只使用一个字符,所以我试图决定使用哪个字符。这是特定于算法的,正在寻找建议。我应该如何改写这个问题?
    • 我感觉有误会,不知道在哪里。您可以选择 (Hash(StudentID) % 36) 作为分区键,选择 StudentID 作为 PK。这行得通吗?
    • 如果您尝试限制创建的分区数量,将来可能会产生性能问题。每个分区只有 1k 个项目可以正常工作,但每个分区只有 10k 个项目不能很好地工作。如果您要这样做,请注意您需要某种方式来管理这些分区的大小,或者非常确定您的数据增长情况。
    • @knightpfhor 我很想将此逻辑封装到每个人都可以使用的库中,所以我考虑了您的担忧。您如何看待查找和缓存每个表的分区计数的预查询处理器?由于分区要求会随时间而变化,因此后台工作人员可能会根据需要将数据迁移到新的分区方案。为了保持运行中的查询运行,预查询处理器可能会跟踪新旧分区计数并在写入时更新(但仅从旧分区“读取”直到迁移完成)。只是一个想法。
    猜你喜欢
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多