计算 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;
}
这是一个通用函数,您只需要 tableName
和 partitionKey
。
我想你可以直接在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
变量的总行数取决于查询。
我已经看到关于如何获取 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;
}
这是一个通用函数,您只需要 tableName
和 partitionKey
。
我想你可以直接在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
变量的总行数取决于查询。