使用分区键和范围RowKeys时,Azure表上的查询性能较慢

时间:2013-12-03 22:10:49

标签: azure azure-storage azure-table-storage

我对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多行数据?

2 个答案:

答案 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使用率,这有助于改善这些查询的延迟。

希望这有帮助。