通过行键集合查询azure表

时间:2012-05-22 02:04:32

标签: .net azure azure-storage azure-table-storage

我需要通过行键集合(在一个分区中)查找几个实体。这样做的正确查询是什么?

3 个答案:

答案 0 :(得分:5)

这取决于您要优化的内容。事实证明,指定多个行键,即使它们都在同一个分区中,也会导致分区扫描。查询优化器不足以处理OR查询。分区扫描可能需要几十到几百毫秒,具体取决于分区的大小。它总是比点查询慢。

如果要优化速度,则应分别执行每个查询。不要使用任务并行库,使用开始/结束功能,它们可以更好地扩展。

如果不考虑延迟,请执行OR查询。它会慢一点,但它会算作一次交易,所以会更便宜。

答案 1 :(得分:2)

仅通过rowkey查询的问题(我正在解释原始问题的暗示):您最终会进行表扫描,因为该rowkey可能存在于任何分区中。而且,如果你单独执行这些查询,你最终会为每个查询执行一次表扫描(即使使用任务并行库,正如@GlennFerrieLive在对原始问题的评论中所建议的那样)。

您可以使用$filter指定rowkey的范围(如this article中所述),或者指定行键的离散列表(限制为过滤器内的15个单独比较)。这应该只有一个表扫描,但仍然是...表扫描。

如果可以在查询中指定分区键,则应该这样做,因为它会使查询返回更快。好的,快得多是相对的,因为我不知道你要存储的数据量。

编辑:通过评论进行更新,因为您知道partitionkey,您可以按照上面的指导指定单个过滤器中的rowkey范围或离散rowkeys。或者......如果你有更多的rowkeys,你可以考虑通过TPL执行这些(现在没有表扫描,这是有意义的),可以是每个过滤器的单个rowkey,也可以分组到范围或过滤列表中。

答案 2 :(得分:0)

您可以在运行时中创建过滤器字符串,并在异步的情况下运行ExecuteQuery或ExecuteQuerySegmentedAsync。例如在C#中:

string queryFilter = $"(PartitionKey eq '{<PK name>}') and" +
                $"({string.Join(" or", <YOUR LIST>.Select(tl => $"(RowKey eq '{<the property>}')"))})";

var query = new TableQuery<ExternalTranslationEntity>().Where(queryFilter).Take(<e.g yourList>.Count).
                Select(new List<string> { nameof(<if you want specific columns>) });

            TableContinuationToken? token = null;
            do
            {
                var segment = await _translationsTable.ExecuteQuerySegmentedAsync(query, token);

                if (segment.Results.Any())
                {
                    segment.Results.ForEach(r =>
                    {
                        //do whaterver you want
                    });
                }
                token = segment.ContinuationToken;
            } while (token != null);