C# 提高此Azure表行数查询的性能

C# 提高此Azure表行数查询的性能,c#,.net,azure,azure-storage,azure-table-storage,C#,.net,Azure,Azure Storage,Azure Table Storage,我对Azure表有以下查询: var count = table.ExecuteQuery(new TableQuery<MessageEntity>()).Count(); 这个查询真的很慢。在我的开发机器上计算总共85000条记录大约需要15秒。我使用withUseDevelopmentStorage=true作为连接字符串。我能做些什么来提高它的性能?我所要做的就是统计记录的数量,肯定有更快的方法吗?Azure表存储中没有统计功能。在您的查询中实际发生的事情是,您将收回所有记

我对Azure表有以下查询:

var count = table.ExecuteQuery(new TableQuery<MessageEntity>()).Count();

这个查询真的很慢。在我的开发机器上计算总共85000条记录大约需要15秒。我使用with
UseDevelopmentStorage=true
作为连接字符串。我能做些什么来提高它的性能?我所要做的就是统计记录的数量,肯定有更快的方法吗?

Azure表存储中没有统计功能。在您的查询中实际发生的事情是,您将收回所有记录并逐个枚举它们

有一个选项可供选择,但我在这里建议的任何东西都不会利用内置功能。您可以自己维护一个计数器,但您必须确保仅在上对主表进行原子写入写入和删除计数器。你可以看到这很容易出错


表存储是一个具有聚集键的键值对存储,由分区键和行键组成。差不多就是这样。如果您需要聚合功能,我建议您查看DocumentDB(尽管它们只实现了一些聚合功能)或SQL Azure。

Azure表存储中没有计数功能。在您的查询中实际发生的事情是,您将收回所有记录并逐个枚举它们

有一个选项可供选择,但我在这里建议的任何东西都不会利用内置功能。您可以自己维护一个计数器,但您必须确保仅在上对主表进行原子写入写入和删除计数器。你可以看到这很容易出错


表存储是一个具有聚集键的键值对存储,由分区键和行键组成。差不多就是这样。如果您需要聚合功能,我建议您查看DocumentDB(尽管它们只实现了一些聚合功能)或SQL Azure。

因为您可能已经知道Azure表的LINQ支持有限,并且当前不支持计数()

var count=table.ExecuteQuery(new TableQuery()).count();
上面的代码正在从表中获取所有实体(一次最多1000个实体),因为您的表中有20000个实体,所以它向Azure表发出了至少20个请求。因为每个请求都是对Azure Tables REST API的HTTP请求,所以您会发现它花费了这么多时间。当您试图从实际存储帐户获取表中实体的计数时,情况会变得更糟

减少时间的一种方法是减少通过网络传输的数据(尤其是响应数据)。当前,实体的每个属性都作为响应数据的一部分返回。由于您只对总计数感兴趣,因此可以使用一个属性(例如
PartitionKey
RowKey
)作为响应。这样,您的响应数据将比您当前拥有的数据小得多,这将在一定程度上减少时间


如果知道计数对您来说真的很重要,那么您可以做的另一件事是通过一些后台进程计算计数,并在一个单独的表中进行更新。

因为您可能已经知道Azure表的LINQ支持有限,并且当前不支持计数()

var count=table.ExecuteQuery(new TableQuery()).count();
上面的代码正在从表中获取所有实体(一次最多1000个实体),因为您的表中有20000个实体,所以它向Azure表发出了至少20个请求。因为每个请求都是对Azure Tables REST API的HTTP请求,所以您会发现它花费了这么多时间。当您试图从实际存储帐户获取表中实体的计数时,情况会变得更糟

减少时间的一种方法是减少通过网络传输的数据(尤其是响应数据)。当前,实体的每个属性都作为响应数据的一部分返回。由于您只对总计数感兴趣,因此可以使用一个属性(例如
PartitionKey
RowKey
)作为响应。这样,您的响应数据将比您当前拥有的数据小得多,这将在一定程度上减少时间


如果知道计数对您来说真的很重要,那么您可以做的另一件事是通过一些后台进程计算计数,并在一个单独的表中进行更新。

以下是如何在azure表中获取单个分区的实体计数,而无需检索实体。对于每个分区,创建一个额外的实体,让我们称之为行计数实体,具有相同的分区键,但有一个恒定的行键(即“rowcountRK”)。行计数实体将有一个长类型属性,即“rowCount”,它将保留该分区的行数

每次向该分区插入实体时,也会增加该分区的rowCount实体的rowCount属性。在批处理操作中可以实现这一点。Azure表批处理操作是同一分区内的原子操作,因此不会有任何不一致性。同样,每次从分区中删除实体时,也会减少行计数实体的rowCount属性,并再次在批处理操作中将这些操作发送到azure表存储以实现一致性和原子性

现在,如果要查询单个分区中的行数,只需查询该分区的行计数实体,而无需检索/扫描任何其他内容。如果要获取整个表中的行总数,假设表中有多个分区,则需要查询表中的所有行计数实体,并将它们的行总数相加
public class MessageEntity : TableEntity
{
    public MessageEntity() { }

    public string Message { get; set; }
}
var count = table.ExecuteQuery(new TableQuery<MessageEntity>()).Count();