.net 在C#中查询Azure表存储以加快数据检索

s2j5cfk0  于 2023-02-06  发布在  .NET
关注(0)|答案(1)|浏览(228)

我有一个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更分散时,这个方法才有效。
我怎样才能以更快的方式检索数据?如有任何帮助,不胜感激:)

vxf3dgd4

vxf3dgd41#

在Azure表存储中,PartitionKey和RowKey的组合Point Query用作聚集索引,是最有效的查找方式。通过将两者放在一起,存储将立即知道要查询哪个分区,并对该分区中的RowKey执行查找。
但是正如您所提到的,Rowkey对您来说是未知的,因此目前您正在执行Partition Scan,它使用partitionkey值和一些其他过滤器。
根据我的理解,您可以通过在QueryAsync方法中设置值MaxPerPage来使用分页和延续标记,然后将延续标记值传递给AsPages()方法,并使用下一页的标记获取每页的数据。
下面是与您使用的代码类似的示例代码。请查看分别传递给QueryAsync()和AsPages()方法的参数maxPerPage和continuationToken:-

var customers = _tableClient.QueryAsync<CustomerModel>(filter: "", maxPerPage: 5);
await foreach (var page in customers.AsPages(continuationToken))
{
    return Tuple.Create<string, IEnumerable<CustomerModel>>(page.ContinuationToken, page.Values);
}

相关问题