我在 Azure 表上有以下查询:
var count = table.ExecuteQuery(new TableQuery<MessageEntity>()).Count();
这是MessageEntity
:
public class MessageEntity : TableEntity
{
public MessageEntity() { }
public string Message { get; set; }
}
这个查询真的很慢。在我的开发机器上统计总共 85,000 条记录大约需要 15 秒。我正在使用Azure Storage Emulator使用 UseDevelopmentStorage=true
作为我的连接字符串。我能做些什么来提高它的性能?我想做的就是计算记录数,肯定有更快的方法吗?
最佳答案
以下是如何在不检索实体的情况下获取 Azure 表中单个分区的实体计数的方法。对于每个分区,创建一个附加实体,我们将其称为行计数实体,具有相同的分区键但行键不变(即“rowcountRK”)。行计数实体将具有单个长类型属性,即。 “rowCount”将保留该分区的行数。
每次将实体插入到该分区时,也会增加该分区的行计数实体的 rowCount 属性。您可以通过批处理操作来完成此操作。 Azure表批处理操作在同一分区内是原子的,因此不会出现任何不一致。同样,每次从分区中删除实体时,您还会减少行计数实体的 rowCount 属性,并再次将批处理操作中的这些操作发送到 Azure 表存储,以实现一致性和原子性。
现在,如果您想查询单个分区中的行数,您所需要做的就是查询该分区的行计数实体,无需检索/扫描任何其他内容。如果你想获取整个表的总行数,假设你的表中有多个分区,那么你需要查询表中的所有行计数实体,并在客户端将它们的行计数属性值相加边。这将导致表扫描,但有效负载会更小,它可能也比扫描整个表更快。或者,如果您知道分区键,那么您可以对每个分区的行计数实体进行并发点查询并将它们相加,这很可能比整个表扫描更有效。
关于c# - 提高此 Azure 表行计数查询的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40363502/