【问题标题】:What is the disadvantage to unique partition keys?唯一分区键有什么缺点?
【发布时间】:2015-12-03 12:13:37
【问题描述】:

我的数据集只会被直接查询(意味着我正在通过某个标识符查找特定项目)或将被完整查询(意味着返回表中的每个项目)。鉴于此,是否有任何理由使用唯一的分区键?

根据我的阅读(例如:https://azure.microsoft.com/en-us/documentation/articles/storage-table-design-guide/#choosing-an-appropriate-partitionkey),非唯一分区键的优势在于能够进行事务更新。我不需要在这个数据集中进行事务更新,所以除了一些独特的东西(例如,GUID)之外,还有什么理由进行分区?

假设我为每个项目使用唯一的分区键,这意味着每个分区将有一行。我应该在行键中重复分区键还是应该只为行键设置一个空字符串?是否允许空行键?

【问题讨论】:

  • 不允许空行键。 听起来就像您想将所有数据保存在同一个分区中,分区中的每个唯一行都将具有唯一的行键(它必须这样做)。如果不进一步了解您的数据,可能很难确定,但如果您要返回每一行,那么将它们分布在分区中可能会影响性能。
  • @BrendanGreen 我认为分散它们会提高性能,因为每个分区都可以并行读取数据?
  • @BrendanGreen 确实允许 null 或空 RowKey。我在我的应用程序中经常使用它。
  • 好的 - 我想我可能已经将插入、更新和删除操作必须存在行键的要求解释为非空。

标签: azure azure-storage azure-table-storage


【解决方案1】:

我认为餐桌服务自动缩放功能可能无法完美运行。当分区中的某些数据“热”时,表服务会将它们移动到另一个集群以提高性能。但是由于您有唯一的分区键,您的实体可能不会被确定为“热”,而如果您将它们分组到分区中,则某些分区将是“热”并移动。如果您使用的是静态分区键,也可能存在以下问题。

此外,表服务可能会在以下情况下返回查询的部分实体

  1. 结果中的实体超过 1000 个。
  2. 已跨越分区边界。

根据您的请求,您还需要完整查询(返回所有实体)。如果您使用唯一的分区键,这意味着每个实体都是一个唯一的分区,因此您的查询将只返回一个带有continue token 的实体。您需要使用此continue token 触发另一个查询以检索下一个实体。我不认为这是你想要的。

所以我的建议是,在任何情况下都选择一个合理的分区键,即使它在您的业务中看起来毫无用处,因为它有助于表服务优化您的数据。

【讨论】:

  • “如果您使用唯一的分区键,这意味着每个实体都是一个唯一的分区,因此您的查询将只返回 1 个带有继续令牌的实体。” -- 这不是真的,你可以在一个表中插入两个具有不同分区键的实体后​​运行一个快速测试来验证。
  • @EmilyGerner-Microsoft 当我学习表服务并发现提到的博客文章blogs.msdn.com/b/windowsazurestorage/archive/2010/11/06/… 时,我牢记这个限制。它说“当跨越分区边界时,也可能返回一个继续令牌。”。你的意思是这个限制在以后的天蓝色平台升级中已经解决了吗?
  • 不,如果您阅读我的回复,这意味着服务器端分区边界——一台服务器可能有多个分区。如果我们跨服务器,您将获得一个延续令牌。
【解决方案2】:

如果您不需要 EntityGroupTransaction 来批量更新实体,唯一的分区键对您来说是个不错的选择。

【讨论】:

    【解决方案3】:

    Zhaoxing's answer 基本上是正确的,但我想对其进行扩展,以便您了解更多原因。

    表分区定义为表名加上分区键。一台服务器可以有很多分区,但一个分区只能在一台服务器上。

    这种基本设计意味着对存储在单个分区中的实体的访问无法实现负载平衡,因为分区支持原子批处理事务。因此,单个表分区的可伸缩性目标低于整个表服务的可伸缩性目标。跨多个分区分布实体可让 Azure 存储更好地扩展负载。

    点查询是最佳的,这很棒,因为听起来这就是您将要做的很多事情。如果分区键没有逻辑意义(即,您不希望特定分区中的所有实体),则最好将其拆分为多个分区键。列出表中的所有实体总是会比较慢,因为这是一次扫描。如果我们达到超时、1000 个实体或服务器边界(如上所述),Azure 存储将返回延续令牌。许多存储客户端库都有方便的方法,可以帮助您在遍历列表时自动遵循这些标记来处理此问题。

    TL;DR:根据您提供的信息,我建议每个项目使用唯一的分区键。不允许使用空行键,但是您想构造行键也可以。

    阅读:

    Azure Storage Table Design Guide

    Azure Storage Performance Check List

    【讨论】:

    • 感谢您的补充。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 2013-12-22
    相关资源
    最近更新 更多