如何加快仅使用分区键的查询

问题描述 投票:1回答:2

我们如何提高查询速度?

在执行以下查询的1-2 minutes范围内

我们大约有[<100个消费者。这些运行中的每个运行都代表一个消耗函数的运行。

TableQuery<T> treanslationsQuery = new TableQuery<T>() .Where( TableQuery.CombineFilters( TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, sourceDestinationPartitionKey) , TableOperators.Or, TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, anySourceDestinationPartitionKey) ) );
此查询将产生大约

5000个结果。

完整代码:

public static async Task<IEnumerable<T>> ExecuteQueryAsync<T>(this CloudTable table, TableQuery<T> query) where T : ITableEntity, new() { var items = new List<T>(); TableContinuationToken token = null; do { TableQuerySegment<T> seg = await table.ExecuteQuerySegmentedAsync(query, token); token = seg.ContinuationToken; items.AddRange(seg); } while (token != null); return items; } public static IEnumerable<Translation> Get<T>(string sourceParty, string destinationParty, string wildcardSourceParty, string tableName) where T : ITableEntity, new() { var acc = CloudStorageAccount.Parse(Environment.GetEnvironmentVariable("conn")); var tableClient = acc.CreateCloudTableClient(); var table = tableClient.GetTableReference(Environment.GetEnvironmentVariable("TableCache")); var sourceDestinationPartitionKey = $"{sourceParty.ToLowerTrim()}-{destinationParty.ToLowerTrim()}"; var anySourceDestinationPartitionKey = $"{wildcardSourceParty}-{destinationParty.ToLowerTrim()}"; TableQuery<T> treanslationsQuery = new TableQuery<T>() .Where( TableQuery.CombineFilters( TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, sourceDestinationPartitionKey) , TableOperators.Or, TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, anySourceDestinationPartitionKey) ) ); var over1000Results = table.ExecuteQueryAsync(treanslationsQuery).Result.Cast<Translation>(); return over1000Results.Where(x => x.expireAt > DateTime.Now) .Where(x => x.effectiveAt < DateTime.Now); }
在这些执行期间,当有100个使用者时,如您所见,请求将聚集并形成峰值:

enter image description here

在这些高峰期间,请求通常需要1分钟以上的时间:

enter image description here

我们如何提高查询速度?

c# azure-table-storage
2个回答
0
投票
var over1000Results = table.ExecuteQueryAsync(treanslationsQuery).Result.Cast<Translation>(); return over1000Results.Where(x => x.expireAt > DateTime.Now) .Where(x => x.effectiveAt < DateTime.Now);
这里是问题之一,您正在运行查询,然后使用这些“ wheres”从内存中对其进行过滤。将过滤器移至查询运行之前,这会很有帮助。

第二,您必须提供从数据库中检索的行数限制


0
投票
不幸的是,下面的查询引入了

全表扫描:

TableQuery<T> treanslationsQuery = new TableQuery<T>() .Where( TableQuery.CombineFilters( TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, sourceDestinationPartitionKey) , TableOperators.Or, TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, anySourceDestinationPartitionKey) ) );
您应该将其分成两个分区键过滤器并分别查询,这将成为两个

分区扫描

,并且执行效率更高。
© www.soinside.com 2019 - 2024. All rights reserved.