Performance 使用部分行键时是否对Azure表存储进行索引查询?

Performance 使用部分行键时是否对Azure表存储进行索引查询?,performance,azure,azure-table-storage,Performance,Azure,Azure Table Storage,我从MS PDC演示中了解到,PartitionKey用于跨多个服务器对表进行负载平衡,但似乎没有人就PartitionKey是否用作单个服务器中的索引给出任何建议 同样,每个人都会告诉您,指定PartitionKey和RowKey可以获得很好的性能,但是似乎没有人告诉您RowKey是否用于提高PartitionKey中的性能 下面是一些示例查询,以帮助我确定问题的框架。假设整个表包含100000000行 PartionKey=“123”和OtherField=“def” PartitionKe

我从MS PDC演示中了解到,PartitionKey用于跨多个服务器对表进行负载平衡,但似乎没有人就PartitionKey是否用作单个服务器中的索引给出任何建议

同样,每个人都会告诉您,指定PartitionKey和RowKey可以获得很好的性能,但是似乎没有人告诉您RowKey是否用于提高PartitionKey中的性能

下面是一些示例查询,以帮助我确定问题的框架。假设整个表包含100000000行

  • PartionKey=“123”和OtherField=“def”
  • PartitionKey=“123”和RowKey>=“aaa”和RowKey<“aac”
  • 以下是我的问题:

    • 如果每个分区中只有10行,查询1是否会很快
    • 如果每个分区中有1000000行,查询2会快吗

    在ATS中,分区键用作分发查找,而不是索引。从使用ATS的级别来看,只考虑分区键和“服务器”/节点共享1:1的关系。(在幕后,这不是事实,但优化恰好位于同一物理/虚拟节点上的分区密钥等概念从Azure消费者必须处理的问题中抽象出了几个层次。这些细节纯粹是整个Azure基础设施的内部信息,对于ATS,最好假设这是一个最佳的解决方案可以这样说……也就是“别担心”)

    在DBMS vs ATS的上下文中,行键是最接近“索引”的东西,因为它有助于在类似节点上查找数据。要直接回答您的一个问题,RowKey是PartitionKey中的索引

    然而,稍微跳出框框,PartitionKey可以让您的性能更接近您对传统索引的看法,但这只是因为数据在ATS节点上的分布特性。您应该首先优化布局到PartitionKey,然后优化到RowKey。(aka,如果只有一个可设置关键帧的值,则将其设置为PartKey)

    一般来说,查询的执行顺序是从效率最高到效率最低

    1.PartitionKey=x和RowKey=y(和OtherProp=z) 因为查找会到达右侧节点,然后到达分区上的索引道具

    2.分区键=x(其他属性=z) 因为你到达了正确的节点,但随后到达了ATS equvi。全表扫描

    3.OtherProp=z 因为您必须先进行分区扫描,然后进行表扫描


    有了这些,你就可以直接提问了

  • 我觉得这个问题无法回答。它是主观的(即“什么是快的?”)。它总是比Query2慢,但是对于10行,“慢度”可能是毫秒,甚至是毫秒

  • (类似主题)它将比查询1更快。任何时候你可以做查询2,你应该

  • 因此,有了这些解释和你的问题,真正的答案可以归结为你的架构师如何使用ATS

    根据您的数据集(当前和预期增长),您需要确定一个合适的方案,以便以最快的方式到达分区和行。了解查找是如何发生的,您可以做出逻辑决策,确定哪条路径能够足够快地到达目的地,多个部分,少行-与少个部分,多行等等

    对于#1,扫描十个实体的速度是多么快

    对于#2,它取决于该行键范围内有多少个实体。(指定分区键和行键的范围意味着我们将只对该范围内的实体执行索引查询。)您没有说有多少个实体,但例如,如果有十个实体,那么它的性能应该与#1相同。

    表是通过(PartitionKey,RowKey)索引的。具有相同分区密钥的行保证从同一分区提供服务。具有不同PartitionKey的行可能在同一分区上,也可能不在同一分区上。所以我不知道你怎么知道一个分区只有10行

    如果只有10行PartitionKey=“123”,那么第一个查询将是“fast”。
    第二个查询将是“fast”

    两者都应该相对较快

    查询1必须在单个分区内进行完整扫描(ATS术语中的范围扫描),但这意味着要遍历10个实体

    查询2还将导致范围扫描,但使用RowKey作为分区内的索引,因此它应该仍然很快


    您可以获得一篇非常详细的博客文章,其中包括每个查询的所有性能影响,以及如何定义最佳键:

    除了Taylor的答案之外,类似的语句也适用于范围查询,如前所述


    换句话说,Azure表存储实际上可以被认为只有一个索引,由两部分组成,分区键和范围键,按顺序排列。

    我认为自编写以来,有些事情可能已经发生了变化,但如果您阅读了这些内容,您可以得出一些结论

    例如,可以在节点/物理服务器之间移动分区。如果有多个分区可以比单个分区更好地扩展。如果您有一个巨大的分区,那么您将受到单个分区吞吐量的限制

    请注意,许多小分区(范围内连续)可以移动到单个节点/物理服务器。如果分区在逻辑上紧密地分组在一起(即排序),则跨分区扫描不必太慢

    如果您需要分区密钥来处理超过2000 req/sec的请求,那么您必须找到一种将分区密钥拆分为多个分区的方法,否则,这并不重要

    哦,而且您只能在单个分区键内执行实体组事务,这可能会影响您的设计

    因此,总结一下:

    • 你需要更多吗