当前位置: 首页 > 知识库问答 >
问题:

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

巴英韶
2023-03-14

我们在Azure Table Storage中有一个表,自从新实现以来,它目前有50,000个条目。

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

我们使用 TableQuery 生成筛选条件。PartitionKey filter是这样的:PartitionKey ge '201801240000000000'

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

要获取大约一个月的数据,大约需要5秒。而要在大约3个月的时间内拿到,需要的时间比这还要长。

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

如有任何改进性能的建议,将不胜感激。


共有2个答案

汪学真
2023-03-14

里克夫德博什的回答非常准确。

假设这是一个应用程序,下面是一些额外的想法。一种方法是并行读取较小的分区键范围。例如,假设正在处理的范围为2018年6月,我们将有:

  • 线程1=

此外,在不使用TableQuery结构的情况下,可以更积极地并行读取较小的分区(例如每天)。

请注意,上述两种方法都不处理高度不平衡的分区策略。例如,假设 2018 年 6 月 95% 的数据存储在“20180605”到“20180610”的范围内,或者存储在一天内,在这种情况下,与串行读取相比,总体执行时间可能会或可能不会感觉到改善,特别是因为并行度开销(例如线程、内存分配、同步等)。

现在,假设这是在 Windows 操作系统上运行的 .NET 应用程序,并且上述方法适用于您的方案,请考虑:

    < li >增加最大连接数; < li >禁用Nagle算法

在下面找到要在应用程序配置中更改的代码段。请注意:

> < li >可以为maxconnection定义地址(例如https://stackoverflow.com ),而不使用“*”。 < li>

建议在发布到生产环境之前运行性能测试,以基准测试maxconnection的适当配置。

有关连接管理的详细信息,请访问:https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/network/connectionmanagement-element-network-settings.

邓浩漫
2023-03-14

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

  • 点查询是最有效的查找方式,建议用于大容量查找或需要最低延迟的查找。通过指定PartitionKey和RowKey值,这样的查询可以使用索引非常有效地定位单个实体。例如:$filter=(Partithtml" target="_blank">ionKey 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顺序排序的实体。要避免在客户端中使用实体,请选择定义最常见排序顺序的行键

来源:Azure 存储表设计指南:设计可缩放表和高性能表

另一篇非常有用的文章是:在Windows Azure表存储中分区键和RowKey的用途,尤其是当您查看此图像时:

编辑:< br >如果您希望有多种方式来查询数据,请考虑以多种方式存储它们。尤其是因为存储很便宜,多次存储数据并没有那么糟糕。通过这种方式,您可以优化读取。这就是所谓的物化视图模式,它可以“帮助支持高效的查询和数据提取,并提高应用程序性能”。

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

 类似资料:
  • 我想评估一下我的Windows Azure表存储查询是如何缩放的。为此,我建立了一个简单的测试环境,在这个环境中,我可以增加表中的数据量,并测量查询的执行时间。基于时间,我想定义一个成本函数,它可以用来评估未来查询的性能。 我评估了以下查询: 使用PartitionKey和RowKey查询 使用PartitionKey和属性进行查询 使用PartitionKey和两个行键进行查询 带有Partit

  • 我正在数据库中运行以下查询: 它输出500行,其中只有一个结果列,运行大约需要1分钟43秒。输出以下计划: 逻辑是:对于每个选择的(在500个id的列表中)计算整数列,返回该金额与数字2147483647之间的较小值。结果必须包含500行,每个id对应一行,我们已经知道它们将与子查询中的至少一行匹配,因此不会生成空值。 索引仅是上的一个b树,属于整数类型。索引是主键上的b树,也是整数类型。表中的每

  • 我必须对Azure表存储进行查询,其中我有以下设置:RowKey、PartitionKey、ThirdColumn RowKey是唯一的,Partitionkey与ThirdColumn相关联,这意味着所有值为“Y”的第三列都将具有分区键“X”。 我必须使用ThirdColumn值获取分区键为X的所有实体。这将不是Performance,因为Y既不是PartitionKey也不是RowKey。 问

  • 问题内容: 有人愿意帮助我吗?在具有10000行的MEMORY表上,以下查询大约需要18秒。如果我没有“ where”约束,则只需不到一分钟的时间。我已经打开查询缓存以及将其作为准备好的语句来尝试。有什么我可以做的吗?索引还是什么? 问题答案: 我认为这将为您提供所需的信息,而不管您关注的滚动日期范围…我已经通过创建带有两个标识列的自己的“发票”表进行了测试。使用@mySQL变量实际上非常简单,可

  • 问题内容: 我有2张桌子,和。用户可以有很多游戏。我需要所有有人数的人,以及他们的人数(有专栏的)。 附言:我需要将所有数据加载到管理表中。由于游戏太多。我决定对数据进行分页和限制。但是,甚至限制以下查询也需要花费相同的时间。如何更好地查询? 问题答案: 您可以在下面尝试使用表达式

  • 我试图使用rest API从azure数据表中检索数据。 Api错误已输出,数据无效。 如果我同时添加RowKey和PartitionKey,就像下面这样。它起作用了。 是否需要通过行键? 如果我只想从一个分区检索所有数据。我知道,我们可以在查询参数中添加一个$filter,但这不会导致性能问题吗? 请分享你的想法。 谢谢!