Azure存储表查询实体是否确实存在数量限制?

时间:2014-07-18 09:00:48

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

MSDN开始,查询服务返回的实体数量似乎有限制:

  

针对Table服务的查询一次最多可返回1,000个实体,并且最多可执行五秒。

但是当我写一个示例来展示这个问题时,我没有发现返回实体数量的任何限制,这是我的关键代码:

public class DataProvider
{
    public static string PartitionKey
    {
        get { return "PartitionKey"; }
    }

    public static IEnumerable<CustomerEntity> MoreThanThousandData()
    {
        var result = new List<CustomerEntity>();
        for (int i = 0; i < 1200; i++)
        {
            result.Add(new CustomerEntity(PartitionKey, Guid.NewGuid().ToString())
            {
                Name = Guid.NewGuid().ToString(),
                Age = new Random().Next(10, 70)
            });
        }

        return result;
    }
}

将1200个实体插入表中:

public class AfterOptimize
{
    public void InsertDataToTable()
    {
        var cloudData = DataProvider.MoreThanThousandData();
        Console.WriteLine("Plan to insert {0} entities to the table.", cloudData.Count());

        InsertDataToTableInternal(AzureTableService.Table, cloudData);
    }

    private void InsertDataToTableInternal(CloudTable table, IEnumerable<ITableEntity> data)
    {
        var splitedData = data.Chunk(100);
        Parallel.ForEach(splitedData, item =>
        {
            var batchInsertOperation = new TableBatchOperation();
            foreach (var tableEntity in item)
            {
                batchInsertOperation.Add(TableOperation.Insert(tableEntity));
            }

            table.ExecuteBatch(batchInsertOperation);
        });
    }
}

然后,从表中读取,分区键在这里都是相同的:

public void ReadCloudData()
{
    InsertMoreThanOneThousandDataToTable();
    var query =
        new TableQuery<CustomerEntity>().Where(TableQuery.GenerateFilterCondition("PartitionKey",
            QueryComparisons.Equal, DataProvider.PartitionKey));
    var result = AzureTableService.Table.ExecuteQuery(query);
    Console.WriteLine("Read {0} entities from table.", result.Count()); // output 1200
}

我只使用了最新的Azure存储.NET客户端API。

1 个答案:

答案 0 :(得分:8)

我无法找到文档链接,但ExecuteQuery方法在内部处理延续令牌,并将返回表格中的所有实体。因此,您所看到的行为是正确的。

如果在执行此代码时运行Fiddler,您会注意到向表服务发送了多个请求。第一个请求将没有延续令牌,但在后续请求中,您将看到NextPartitionKeyNextRowKey查询字符串参数。