我们在Azure Table Storage中有一个表,自从新实现以来,它目前有50,000个条目。
PartitionKey:字符串形式的日期时间值< br> RowKey:字符串形式的数值
我们使用 TableQuery
生成筛选条件。PartitionKey filter是这样的:PartitionKey ge '201801240000000000'
不幸的是,我们不能使用RowKey过滤器,因为我们需要两个日期之间的数据。
要获取大约一个月的数据,大约需要5秒。而要在大约3个月的时间内拿到,需要的时间比这还要长。
虽然我们有一个缓存策略,但第一次获取数据需要很长时间。就像数据过滤器在日期发生变化时需要很长时间一样。
如有任何改进性能的建议,将不胜感激。
里克夫德博什的回答非常准确。
假设这是一个应用程序,下面是一些额外的想法。一种方法是并行读取较小的分区键范围。例如,假设正在处理的范围为2018年6月,我们将有:
此外,在不使用TableQuery结构的情况下,可以更积极地并行读取较小的分区(例如每天)。
请注意,上述两种方法都不处理高度不平衡的分区策略。例如,假设 2018 年 6 月 95% 的数据存储在“20180605”到“20180610”的范围内,或者存储在一天内,在这种情况下,与串行读取相比,总体执行时间可能会或可能不会感觉到改善,特别是因为并行度开销(例如线程、内存分配、同步等)。
现在,假设这是在 Windows 操作系统上运行的 .NET 应用程序,并且上述方法适用于您的方案,请考虑:
在下面找到要在应用程序配置中更改的代码段。请注意:
> < li >可以为maxconnection定义地址(例如https://stackoverflow.com ),而不使用“*”。 < li>
建议在发布到生产环境之前运行性能测试,以基准测试maxconnection的适当配置。
有关连接管理的详细信息,请访问:https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/network/connectionmanagement-element-network-settings.
据我从您的帖子中看到的,您遇到的最大问题是您的查询在一个查询中跨越多个分区。这对于性能来说不是最佳选择。根据下面的列表,您介于分区扫描和表扫描之间,因为您指定了分区键,但使用的是多个分区键。
来源: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,但这不会导致性能问题吗? 请分享你的想法。 谢谢!