我想评估我的 Windows Azure 表存储查询如何扩展。为此,我构建了一个简单的测试环境,我可以在其中增加表中的数据量,并测量查询的执行时间。并且基于时间,我想定义一个可用于评估未来查询性能的成本函数。
我评估了以下查询:
- 使用 PartitionKey 和 RowKey 查询
- 使用 PartitionKey 和属性进行查询
- 使用 PartitionKey 和两个 RowKey 进行查询
- 使用 PartitionKey 和两个属性进行查询
对于最后两个查询,我检查了以下两种模式:
- PartitionKey == "..." && (RowKey == "..." || RowKey == "...")
- (PartitionKey == "..." && RowKey == "...") || (PartitionKey == "..." && RowKey == "...")
为了最大限度地减少传输延迟,我在 Azure 实例上执行了测试。从测量中,我可以看到
- 查询 1(毫不奇怪,因为表是基于这些字段编制索引的)非常快,如果表中有大约 150000 个条目,则大约需要 10-15 毫秒。
- 查询 2 需要进行分区扫描,因此执行时间随着存储的数据线性增加。
- 查询 3.1 的执行几乎与查询 2 完全相同。因此,此查询也执行全分区扫描,这对我来说似乎有点奇怪。
- 查询 4.1 比查询 3.1 慢两倍多一点。所以看起来它是通过两次分区扫描来评估的。
- 最后,查询 3.2 和 4.2 的执行速度几乎比查询 2 慢 4 倍。
你能解释一下查询/过滤器解释器的内部结构吗?即使我们接受查询 3.1 需要分区扫描,查询 4.1 也可以使用相同的逻辑(并且在同一时间)进行评估。查询 3.2 和 4.2 对我来说似乎是个谜。对这些有任何指示吗?
显然,这一点的重点是我想在一个查询中查询不同的元素,以最小化成本同时不损失性能。但似乎对每个元素使用单独的查询(使用任务并行库)是唯一真正快速的解决方案。这样做的公认方式是什么?