C# 计算Azure表存储中分区内的行数

C# 计算Azure表存储中分区内的行数,c#,azure,azure-table-storage,rowcount,C#,Azure,Azure Table Storage,Rowcount,关于如何获取Azure存储表的总行数,我已经看到了各种各样的问题,但我想知道如何获取单个分区内的行数 我如何在将最少的实体数据加载到内存中的同时做到这一点?因为您可能已经知道,Azure表中没有类似计数的功能。为了获得分区(或表)中实体(行)的总数,必须获取所有实体 您可以通过使用名为查询投影的技术来减少响应负载。查询投影允许您指定希望表服务返回的实体属性(列)列表。因为您只对实体的总数感兴趣,所以我建议您只取回PartitionKey。您可能会发现这篇博文有助于理解查询投影:。您可以通过非常高

关于如何获取Azure存储表的总行数,我已经看到了各种各样的问题,但我想知道如何获取单个分区内的行数


我如何在将最少的实体数据加载到内存中的同时做到这一点?

因为您可能已经知道,Azure表中没有类似计数的功能。为了获得分区(或表)中实体(行)的总数,必须获取所有实体


您可以通过使用名为
查询投影
的技术来减少响应负载。查询投影允许您指定希望表服务返回的实体属性(列)列表。因为您只对实体的总数感兴趣,所以我建议您只取回
PartitionKey
。您可能会发现这篇博文有助于理解查询投影:。

您可以通过非常高效地利用azure表存储服务的原子批处理操作来实现这一点。对于每个分区,都有一个具有相同分区键和特定行键(如“PartitionCount”等)的附加实体。该实体将有一个int(或long)属性计数

每次插入新实体时,都要执行原子批处理操作,以增加分区计数器实体的Count属性。分区计数器实体将与数据实体具有相同的分区键,因此允许您在保证一致性的情况下执行原子批处理操作

每次删除一个实体时,转到并减少分区计数器实体的Count属性。同样,在批处理执行操作中,这两个操作是一致的

如果您只想读取partition count的值,那么您需要做的就是对partition counter实体进行单点查询,其count属性将告诉您该分区的当前计数

允许您定义查询,并且可以使用“表统计信息”工具栏项获取整个表或查询的总行数


测试了使用秒表获取和计数分区中100000个实体的速度,该分区除标准TableEntity外还有三个字段

我只选择PartitionKey,并使用解析器以一个字符串列表结束,一旦检索到整个分区,我就会计算字符串列表

我得到的最快速度大约是
6000ms
-
6500ms
。以下是函数:

public static async Task<int> GetCountOfEntitiesInPartition(string tableName, string partitionKey)
    {
        CloudTable table = tableClient.GetTableReference(tableName);

        TableQuery<DynamicTableEntity> tableQuery = new TableQuery<DynamicTableEntity>().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, partitionKey)).Select(new string[] { "PartitionKey" });

        EntityResolver<string> resolver = (pk, rk, ts, props, etag) => props.ContainsKey("PartitionKey") ? props["PartitionKey"].StringValue : null;

        List<string> entities = new List<string>();

        TableContinuationToken continuationToken = null;
        do
        {
            TableQuerySegment<string> tableQueryResult =
                await table.ExecuteQuerySegmentedAsync(tableQuery, resolver, continuationToken);

            continuationToken = tableQueryResult.ContinuationToken;

            entities.AddRange(tableQueryResult.Results);
        } while (continuationToken != null);

        return entities.Count;
    }
公共静态异步任务GetCountOfEntitiesInPartition(字符串表名、字符串分区键)
{
CloudTable=tableClient.GetTableReference(tableName);
TableQuery TableQuery=new TableQuery()。其中(TableQuery.GenerateFilterCondition(“PartitionKey”,QueryComparisons.Equal,PartitionKey))。选择(新字符串[]{“PartitionKey”});
EntityResolver解析器=(pk,rk,ts,props,etag)=>props.ContainsKey(“PartitionKey”)?props[“PartitionKey”]。StringValue:null;
列表实体=新列表();
TableContinuationToken continuationToken=null;
做
{
TableQuerySegment tableQueryResult=
wait table.ExecuteQuerySegmentedAsync(tableQuery、解析器、continuationToken);
continuationToken=tableQueryResult.continuationToken;
entities.AddRange(tableQueryResult.Results);
}while(continuationToken!=null);
返回实体。计数;
}

这是一个通用函数,您只需要
表名
分区键
我想您可以直接使用C#中的
.Count
。您可以使用以下任一方法:

var tableStorageData = await table.ExecuteQuerySegmentedAsync(azQuery, null);
int count = tableStorageData.Count();

TableQuery TableQuery=newtablequery();
var tableStorageData=table.ExecuteQuery(tableQuery,null);
count=tableStorageData.count();

count
变量将具有取决于查询的行总数。

Azure存储表没有原子操作。每个“原子”操作都需要多次请求读取和合并。在发布之前,让我们先开始积累知识。请参见此处:以及注释“更改集中的操作以原子方式处理;即,更改集中的所有操作要么成功,要么失败。操作按更改集中指定的顺序处理。”如果您从未使用Azure存储,请至少仔细阅读文档。Azure存储对单个项目没有任何原子批处理或增量操作。“要么成功,要么失败”意味着你必须不断重复检索、递增、合并直到成功,这在并发环境中意味着递增一项,你必须发送数十个请求。讽刺的是,你肯定不是在阅读或获取我从文档中粘贴的一行。只需搜索句子中的子串原子。从客户端来看,批处理操作是原子的,只是向您解释所有操作成功或失败。这是官方文件和行业用来指批量操作的通用术语。我认为您从未使用过任何批处理操作,因为这在当时很容易理解。具有讽刺意味的是,您没有阅读自己的“证明”。您没有阅读什么是批处理操作。显然,您从未使用过Azure存储。批处理操作仅限于存储操作,一个实体在一批中只能有一次。Azure存储操作不会增加或修改现有值,只会替换整个值。不能在一个原子批处理中读取值、递增值和更新值。IMHO此函数无效。它计算查询的项目数…也写在页面底部的内容。页面底部的数字只计算到1000。当前版本不允许您请求更多。所以,这是一个很有用的方法。正是我想要的。。nic
TableQuery<UserDetails> tableQuery = new TableQuery<UserDetails>();
var tableStorageData = table.ExecuteQuery(tableQuery,null);          
count = tableStorageData .Count();