【发布时间】:2017-06-21 17:50:39
【问题描述】:
我正在使用以下逻辑查询 ATS:
var query = from m in context.CreateQuery<MyTable>(tableName)
where m.PartitionKey.CompareTo(partitionKey) == 0
select m;
var results = new List<MyTable>();
CloudTableQuery<MyTable> messageTableQuery = (CloudTableQuery<MyTable>)query.AsTableServiceQuery();
ResultContinuation rc = null;
do
{
var asyncResult = rc == null ? messageTableQuery.BeginExecuteSegmented(null, null) :
messageTableQuery.BeginExecuteSegmented(rc, null, null);
ResultSegment<MyTable> result = messageTableQuery.EndExecuteSegmented(asyncResult);
results.AddRange(result.Results);
rc = result.ContinuationToken;
} while (rc != null);
return results;
当我指向我的 dev ATS 时,这似乎会在合理的时间内返回,但是当我指向包含数百万个分区的 prod ATS 时,这需要很长的时间。我的问题是,有什么方法可以更有效地查询 ATS?
我的查询不一定需要获取分区键中的所有行键。我只需要其中的一部分。
【问题讨论】:
-
从上面的代码中不清楚您正在执行的查询是否包含
PartitionKey。为获得最佳性能,您的查询必须包含PartitionKey。 -
嗨 Gaurav,我已将查询添加到问题中。
-
如果您知道选择行的任何特定标准,例如按时间戳过滤,则可以添加过滤器。并不是说它会有很大的不同,Partitionkey.compareto 可以更改为 == 。 compareto 主要在需要排序时使用。
-
我知道我想从 ATS 获取的行键列表,但它们不符合条件。它们只是指南的列表。查询 ATS 以获取完整分区并在客户端进行过滤是否更快,或者迭代查询 ATS 以获取 PartionKey==x && RowKey==y 更快?