执行大量Azure表查询的最佳方法是什么?

时间:2015-09-17 19:57:04

标签: c# azure azure-table-storage azure-tablequery

我有一个拥有超过一百万个条目的Azure表,我试图在C#中以编程方式执行大约300,000个查询,以便将一些数据传输到另一个系统。目前我在阅读包含分区和行键的文件时正在执行以下操作:

while (!reader.EndOfStream)
{
    // parse the reader to get partition and row keys
    string currentQuery = TableQuery.CombineFilters(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, partKey), TableOperators.And, TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, rowKey));
    TableQuery<MyEntity> query = new TableQuery<MyEntity>().Where(currentQuery);

    foreach (MyEntity entity in table.ExecuteQuery(query))
    {
        Console.WriteLine(entity.PartitionKey + ", " + entity.RowKey + ", " + entity.Timestamp.DateTime);
    }

    Thread.Sleep(25);
}

这需要很长时间才能完成(5个多小时)。我所看到的查询平均约为200毫秒。我是Azure的新手,所以我认为我做错了什么。我该如何改进呢?

1 个答案:

答案 0 :(得分:2)

一些事情:

  1. 不确定为什么你的循环中有睡眠呼叫。除非您受到限制(存储每秒支持20,000个事务),否则您不需要这样做。
  2. 使用给定的分区键和行键,您将获得一个返回的实体(因为组合pk + rk是唯一的)。无需遍历结果。你要么得到零,要么得到一个。
  3. 您采用的是单线程方法,因此您极不可能非常难以推动存储事务处理速度。考虑并行化检索。
  4. 我假设您没有在实际应用中调用Console.Writeline()。如果是这样,这也会减慢你的速度。
  5. 考虑通过ServicePointManager.UseNagleAlgorithm = false;禁用Nagle的算法。否则,对存储的单个低级调用可能会缓冲最多500毫秒,以便更密集地打包tcp数据包。如果您花费周期处理您阅读的内容,这将非常重要。
相关问题