在RowKey值范围内使用Azure表的词法过滤

时间:2015-03-31 01:26:20

标签: azure azure-storage

问题:没有返回任何结果。

我正在使用以下代码从一个只有100行左右的分区中获取一系列对象:

var rangeQuery = new TableQuery<StorageEntity>().Where(
                TableQuery.CombineFilters(
                    TableQuery.CombineFilters(
                        TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, partitionKey),
                        TableOperators.And,
                        TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.GreaterThanOrEqual, from)
                    ),
                    TableOperators.And,
                    TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.LessThanOrEqual, to)
                )
            );

            var results = table.ExecuteQuery(rangeQuery);
foreach (StorageEntity entity in results)
            {
                storageEntities.Add(entity);
            }

注意:我如何组合3个术语并不重要,不会返回任何结果。我期待的一个例子就是this(partitionKey,rowKey):

“10005678”,“PL7NR_201503170900”

远程过滤器代码生成以下表达式:

  

((PartitionKey eq'10005678')和(RowKey ge'PL7NR_201503150000'))   和(RowKey lt'PL7NR_201504082359')

但我也尝试了这个(出于性能原因,这是我首选的方法,即分区扫描):

  

(PartitionKey eq'10005678')和((RowKey ge'PL7NR_201503150000')和   (RowKey lt'PL7NR_201504082359'))

我的理解是表存储执行词法搜索,因此这些行键应该包含一个包含具有以下键的行的范围:

“10005678”,“PL7NR_201503170900”

我的理解是否存在根本性的错误?

感谢您查看此内容。

更新:感谢Gaurav的回答更新了问题。上面的代码隐式处理延续令牌(即foreach循环),并且分区中只有100个左右的项目,因此我不认为延续令牌是一个问题。

我尝试从密钥中删除下划线('_'),甚至尝试从rowKey移动前缀并将其作为后缀添加到partitionKey。

  

注意:这都是使用存储模拟在我的本地计算机上运行的。

1 个答案:

答案 0 :(得分:2)

来自Query Timeout and Pagination

  

针对Table服务的查询最多可返回1,000个项目   一次可执行最多五秒钟。如果   如果查询没有,结果集包含1,000多个项目   在五秒内完成,或者如果查询穿过分区   边界,响应包括提供开发人员的标题   使用延续令牌来恢复查询   结果集中的下一个项目。延续令牌标题可能是   返回查询表操作或查询实体操作。

请检查您是否回复Continuation Token作为回应。

现在进入过滤器表达式:

  

((PartitionKey eq&#39; 10005678&#39;)和(RowKey ge&#39; PL7NR_201503150000&#39;))   和(RowKey lt&#39; PL7NR_201504082359&#39;)

这个肯定是 Full Table Scan ,因为(RowKey lt 'PL7NR_201504082359')本身就是一个条款。为了执行这个特定的部分,它基本上从表的顶部开始,找出RowKey < 'PL7NR_201504082359'的实体,而不考虑PartitionKey。

  

(PartitionKey eq&#39; 10005678&#39;)和((RowKey ge&#39; PL7NR_201503150000&#39;)和   (RowKey lt&#39; PL7NR_201504082359&#39;))

这个正在执行 Partition Scan ,如果您在指定的分区中有太多数据,或者查询执行时间超过5秒,您可能无法获得结果,如上所述

因此,检查您的查询是否返回任何延续令牌,如果没有返回任何实体,请使用它们来获取下一组实体。

您可能会发现一些有用的资源: