独特的分区键有什么缺点?

时间:2015-09-07 23:20:44

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

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

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

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

3 个答案:

答案 0 :(得分:3)

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

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

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

点查询是最佳的,这很好,因为它听起来像你将要做的很多。如果分区键没有逻辑含义(即,您不想要特定分区中的所有实体),那么您最好分割出许多分区键。列出表中的所有实体总是会变慢,因为它是一次扫描。如果我们达到超时,1000个实体或服务器边界(如上所述),Azure存储将返回连续令牌。许多存储客户端库都有方便的方法,可以帮助您在迭代列表时自动跟踪这些令牌来处理这个问题。

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

读:

Azure Storage Table Design Guide

Azure Storage Performance Check List

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

此外,表服务可能会在

时返回查询的部分实体
  1. 结果中有超过1000个实体。
  2. 划分分区边界。
  3. 根据您的请求,您还需要完整查询(返回所有实体)。如果您使用的是唯一分区键,则表示每个实体都是唯一的分区,因此您的查询将只返回1个带有continue token的实体。并且您需要使用此continue token触发另一个查询以检索下一个实体。我不认为这是你想要的。

    所以我的建议是,在任何情况下选择合理的分区密钥,即使它在您的业务中看起来没用,因为它可以帮助表服务优化您的数据。

相关问题