Azure存储表不返回整个分区

时间:2013-07-16 19:27:39

标签: azure storage

我在

时发现了一些生产情况
CloudContext.TableData.Where( A => A.PartitionKey == "MYKEY").ToList();

其中TableData是

public DataServiceQuery<T> TableData { get { return CreateQuery<T>( _TableName ); } }

不返回整个分区(我的记录少于1000条)。

在我的情况下,它返回367条记录,而在VS2010 Server Explorer或Azure Storage Explorer中,我得到414条记录(条件相同)。

有没有人遇到同样的问题?

此外,如果我更改查询并将RowKey添加到条件中 - 我得到所需的记录没有问题。

3 个答案:

答案 0 :(得分:1)

您必须更好地了解表服务。在官方文档here中列出了影响返回记录数的其他条件。如果要检索整个分区,则必须检查TableResult是否为Continuation Token,并使用提供的continuation token一遍又一遍地执行相同的查询,直到所有结果都出现。

您可以使用类似于以下的方法:

    private IEnumerable<MyEntityType> GetAllEntities()
    {
        var result = this._tables.GetSegmentedEntities(100, null); // null is for continuation token
        while (result.Results.Count > 0)
        {
            foreach (var ufs in result.Results)
            {
                yield return new MyEntityType(ufs.RowKey, ufs.WhateverOtherPropertyINeed);
            }
            if (result.ContinuationToken != null)
            {
                result = this._tables.GetSegmentedEntities(100, result.ContinuationToken);
            }
            else
            {
                break;
            }
        }
    }

GetSegmentedEntities(100, result.ContinuationToken)定义为:

    public TableQuerySegment<MyEntityType> GetSegmentedEntities(int pageSize, TableContinuationToken token)
    {
        var partKey = "My_Desired_Partition_key_passed_via_Const_or_method_Param";
        TableQuery<MyEntityType> query = new TableQuery<MyEntityType>()
            .Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, partKey));
        query.TakeCount = pageSize;
        return this.azureTableReference.ExecuteQuerySegmented<MyEntityType>(query, token);
    }

您可以根据具体情况使用和修改此代码。

答案 1 :(得分:0)

这是一种已知且记录在案的行为。 Table服务API将在5秒内返回1000个实体或尽可能多的实体。如果查询执行时间超过5秒,它将返回一个延续令牌。

通过添加rowkey,您可以使查询更具体,因此更快,因此您可以获得所有实体。

有关详细信息,请参阅MSDN上的TimeOuts and Pagination

答案 2 :(得分:0)

如果您获得部分结果集,则会有两个因素。

i)您有超过1000条与过滤器匹配的记录  ii)查询花了5秒多。  iii)查询跨越分区边界。

由于您的记录少于1000条,因此第一个因素不会成为问题。当您基于PartitionKey检索时,第三个也不会导致任何问题。由于第二个因素,你正面临这个问题。

两个处理你需要处理延续令牌。您可以参考此link了解更多信息。