我有一个ATS表,其分区键和行键如下所示:
PartitionKey RowKey
US_W|000000001 0000200325|0184921077191606273
US_W|000000004 0000200328|0184921077191606277
US_W|000000005 XXXXXXXXXX|XX(somenumbers)XXXX
需要说明的是,我只有PartitionKey来查询这个表,RowKey是未知的。
我使用以下方法从表中检索结果:
public async Task<IList<T>> FetchSelectedDataByPartitionKey<T>(string partitionKey, List<string> columns, QueryComparisonEnums partitionKeyQueryCompareEnums = QueryComparisonEnums.Equal) where T : class, ITableEntity, new()
{
var tableClient = await GetTableClient<T>();
string query = $"PartitionKey {partitionKeyQueryCompareEnums.GetAttribute<EnmDecriptionAttribute>()?.Value} '{partitionKey}'";
AsyncPageable<T> queryResultsFilter = tableClient.QueryAsync<T>(filter: query, select: columns);
List<T> result = new List<T>();
await foreach (Page<T> page in queryResultsFilter.AsPages())
{
foreach (var qEntity in page.Values)
{
result.Add(qEntity);
}
}
return result;
}
这个函数工作正常,但是它需要大约60秒来扫描这个表中的大量数据,并从中过滤和获取75000个实体。为了获得更快的结果集,我已经使用select属性来只获取实体的选定字段,而不是获取整个实体。我读了一些博客,如distributed scan of Azure Table Storage,但我相信只有当PartitionKey更分散时,这个方法才有效。
我怎样才能以更快的方式检索数据?如有任何帮助,不胜感激:)
1条答案
按热度按时间vxf3dgd41#
在Azure表存储中,PartitionKey和RowKey的组合Point Query用作聚集索引,是最有效的查找方式。通过将两者放在一起,存储将立即知道要查询哪个分区,并对该分区中的RowKey执行查找。
但是正如您所提到的,Rowkey对您来说是未知的,因此目前您正在执行Partition Scan,它使用partitionkey值和一些其他过滤器。
根据我的理解,您可以通过在
QueryAsync
方法中设置值MaxPerPage
来使用分页和延续标记,然后将延续标记值传递给AsPages()
方法,并使用下一页的标记获取每页的数据。下面是与您使用的代码类似的示例代码。请查看分别传递给QueryAsync()和AsPages()方法的参数maxPerPage和continuationToken:-