【发布时间】:2020-03-01 06:05:26
【问题描述】:
我们如何提高此查询的速度?
在1-2 minutes 的范围内,我们大约有 100 个消费者在执行以下查询。这些运行中的每一个都代表消耗函数的 1 次运行。
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 个消费者时,如您所见,请求将聚集并形成峰值:
在这些高峰期间,请求通常需要 1 分钟以上:
我们如何提高此查询的速度?
【问题讨论】:
-
5000 个结果似乎您在查询中的过滤不够。仅仅将 5000 个结果传输到代码中就会花费大量的网络时间。没关系,之后您仍然要进行过滤。 |始终在查询中进行尽可能多的过滤处理。理想情况下,在获得索引和/或计算视图的结果的行上。
-
那些“翻译”对象大吗?为什么你不喜欢获取一些参数而不是像整个数据库那样 gettin`?
-
@HirasawaYui 不,他们很小
-
你应该做更多的过滤,拉5000个结果似乎没有意义。在不知道您的数据的情况下无法判断,但我想说您需要找到一种方法以更有意义的方式对其进行分区或在查询中引入某种过滤
-
有多少个不同的分区?
标签: c# azure azure-table-storage azure-virtual-network azure-tablequery