唯一分区键的缺点是什么?

What is the disadvantage to unique partition keys?

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

根据我的阅读(例如:https://azure.microsoft.com/en-us/documentation/articles/storage-table-design-guide/#choosing-an-appropriate-partitionkey),非唯一分区键的优点是能够进行事务更新。我不需要此数据集中的事务更新,所以是否有任何理由根据某些唯一事物(例如 GUID)以外的任何事物进行分区?

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

我认为

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

此外,table 服务可能会 return 您查询的部分实体

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

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

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

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

基本上是正确的,但我想对其进行扩展,以便您能更多地理解其中的原因。

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

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

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

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

阅读中:

Azure Storage Table Design Guide

Azure Storage Performance Check List