计算 Azure table 存储中分区内的行数

Count rows within partition in Azure table storage

我已经看到关于如何获取 Azure 存储 table 的 行数的各种问题,但我想知道如何获取单个分区中的行数。

如何在将 最小 实体数据量加载到内存中时执行此操作?

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

您可以使用一种称为 Query Projection 的技术来减少响应负载。查询投影允许您指定要 table 服务到 return 的实体属性(列)列表。由于您只对实体总数感兴趣,因此我建议您只取回 PartitionKey。您可能会发现此博客 post 有助于理解查询投影:https://blogs.msdn.microsoft.com/windowsazurestorage/2011/09/15/windows-azure-tables-introducing-upsert-and-query-projection/.

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

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

每次删除一个实体,去递减分区计数器实体的计数属性。再次在批处理中执行操作,因此这 2 个操作是一致的。

如果你只想读取分区计数的值,那么你需要做的就是对分区计数器实体进行单点查询,它的计数 属性 会告诉你当前的计数划分。

https://azure.microsoft.com/en-gb/features/storage-explorer/ 允许您定义一个查询,您可以使用 Table 统计工具栏项来获取整个 table 或您的查询

的总行数

测试了使用秒表获取和计算分区中 100,000 个实体的速度,这些实体除标准 TableEntity 外还具有三个字段。

我 select 只是 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;
    }

这是一个通用函数,您只需要 tableNamepartitionKey

我想你可以直接在C#中使用.Count。您可以使用以下任一技术:

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

TableQuery<UserDetails> tableQuery = new TableQuery<UserDetails>();
var tableStorageData = table.ExecuteQuery(tableQuery,null);          
count = tableStorageData .Count();

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