提高 Azure 表存储查询性能的建议

Vic*_*cky 3 azure-storage azure-table-storage azure-tablequery

我们在 Azure 表存储中有一个表,自新实施以来目前有 50,000 个项目。

PartitionKey:字符串形式的日期时间值
RowKey:字符串形式的数值

我们用来TableQuery生成过滤条件。PartitionKey 过滤器类似于:PartitionKey ge '201801240000000000' && "PartitionKey lt '201806220000000000'"

不幸的是,我们无法使用 RowKey 过滤器,因为我们需要两个日期之间的数据。

要获取大约一个月的数据,大约需要 5 秒。而要取3个月左右的时间,则需要更多的时间。

尽管我们有适当的缓存策略,但第一次获取数据需要很长时间。就像数据上的过滤器在日期发生变化时需要很长时间一样。

任何提高性能的建议将不胜感激。

ric*_*sch 5

据我从您的帖子中看到,您遇到的最大问题是您的查询在一个查询中跨越多个分区。这对于性能来说并不是最佳的。根据下面的列表,您处于Partition ScanTable Scan之间,因为您指定了分区键,但您正在使用其中多个分区键。

  • 查询是最有效的查找方式,建议用于大容量查找或需要最低延迟的查找。此类查询可以通过指定 PartitionKey 和 RowKey 值,使用索引非常有效地定位单个实体。例如:$filter=(PartitionKey eq 'Sales') 和 (RowKey eq '2')
  • 第二好的是范围查询,它使用 PartitionKey 并过滤一系列 RowKey 值以返回多个实体。PartitionKey 值标识特定分区,RowKey 值标识该分区中实体的子集。例如:$filter=PartitionKey eq 'Sales' 和 RowKey ge 'S' 和 RowKey lt 'T'
  • 第三好的是分区扫描,它使用 PartitionKey 并过滤另一个非键属性,并且可能返回多个实体。PartitionKey 值标识特定分区,属性值选择该分区中实体的子集。例如:$filter=PartitionKey eq 'Sales' 和 LastName eq 'Smith'
  • 表扫描不包括 PartitionKey,效率非常低,因为它会依次搜索组成表的所有分区以查找任何匹配的实体。无论您的过滤器是否使用 RowKey,它都会执行表扫描。例如:$filter=LastName eq 'Jones'
  • 返回多个实体的查询返回按 PartitionKey 和 RowKey 顺序排序的实体。为了避免对客户端中的实体重新排序,请选择定义最常见排序顺序的 RowKey。

来源:Azure 存储表设计指南:设计可扩展且高性能的表

另一篇非常有用的文章是:What PartitionKey and RowKey are for in Windows Azure Table Storage,特别是当您查看此图片时:

根据分区的大小和负载,分区在计算机上呈扇形分布。每当分区出现高负载或大小增大时,Windows Azure 存储管理就会启动并将分区移动到另一台计算机: 分区

编辑:
如果您想通过多种方式查询数据,请考虑以多种方式存储它们。特别是由于存储很便宜,多次存储数据并不是那么糟糕。这样您就可以优化阅读。这就是所谓的物化视图模式,它可以“帮助支持高效的查询和数据提取,并提高应用程序性能”。

但是,您应该记住,这对于静态数据来说很简单。如果您的数据变化很大,那么在多次存储数据时保持它们同步可能会变得很麻烦。