我对Azure Tables非常陌生,而且我遇到了一些性能问题。 我有一个查询,它使用分区键和远程rowkey获取数千行。
PartitionKey =" Example123"和RowKey> = DateTime.Now.Ticks和RowKey< DateTime.Now.AddHours(1).Ticks。
rowkey是一个带有datetime.Ticks字符串的guid。
此查询需要 2-3秒才能返回8000个条目。这合理吗?
示例条目:
A:" C6-85-08-07-06-98",
B:" C6-85-08-07-06-i1",
C:123,
在:" 2013-12-03T19:16:26.0799718Z",
PartitionKey:" example1",
RowKey:" 635216949860799718_ca86be88-0995-4da8-90d6-351c615ec9ab",
时间戳:" 2013-12-03T19:16:36.5872058 + 00:00",
ETag:" W /" datetime' 2013-12-03T19%3A16%3A36.5872058Z'""
示例代码
这是我使用的代码(SDK 2.1):
TableQuery<RawDataEntity> rangeQuery = new TableQuery<RawDataEntity>().Where(
TableQuery.CombineFilters(
TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, _partitionKey),
TableOperators.And,
IsWithin(from, to)
));
// returns after ~3000 ms
var result = _table.ExecuteQuery(rangeQuery).ToList();
// Helper method
public static string IsWithin(DateTime from, DateTime to)
{
return TableQuery.CombineFilters(
TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.GreaterThanOrEqual, from.Ticks.ToString()),
TableOperators.And,
TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.LessThan, to.Ticks.ToString())
);
}
如果我的查询中没有错误的 - 还有哪些其他方法可以查询大表(容易超过10k行)并返回10 000多行数据?
答案 0 :(得分:1)
考虑到API如何工作,3秒相当快。如果你看看API如何使用像Fiddler这样的工具返回数据,你可能会注意到你的数据是通过几个请求获取的。 API使用分页来返回您的数据。
如果可能,我建议您使用多个并行查询来查询数据的子集。
答案 1 :(得分:0)
你是正确的,api在内部做了多个请求来返回3k行。此外,由于您执行了.ToList(),因此在完成所有请求并将结果缓存在内存中之前,您不会得到任何结果。另一种方法是执行通过ExecuteSegmented [Async] apis分段的查询。这些将允许您更早地获取结果页面,并且如果您希望指定maxresults计数以降低每个请求返回的记录总数。
此外,我建议升级至3.0 client lib。它支持JSON light / Nometadata,根据场景,可以将有效负载降低多达约70%。这将大大减少解析这些查询结果所需的IO和CPU使用率,这有助于改善这些查询的延迟。
希望这有帮助。