从Azure表存储中获取重复值

时间:2013-09-01 13:14:36

标签: c# azure duplicates azure-storage

如何在Azure Table Storage上查询重复值?

假设该表包含一个名为“LastName”的列,并且有一些相同的lastnames。如何在不知道或具有保留姓氏值的特定string的情况下查询该内容?

修改 一个例子是:

Partitionkey RowKey LastName
1            1      Smith
1            2      Smith
1            3      Smith
1            3      MILLER
1            3      WILLIAMS

在这种情况下,我想得到Smith姓氏的所有记录,因为它们是重复的。

2 个答案:

答案 0 :(得分:2)

作为一般经验法则:不包含PartitionKeyRowKey的查询效果不佳。

我假设您的LastName列既不是分区也不是RowKey。在这种情况下,你只有糟糕的选择。表存储的工作方式是将分区的权限紧密地存储在一起,因此最快的查询是包含您要查找的实体的分区键的查询。由于您无法在任何其他列上构建索引,因此所有不包含RowKey的查询都将是分区扫描,即根本不能正常执行,因为必须分析该分区的所有行。

在您的情况下,如果您要查找包含重复值的所有列,您最好的选择可能是查询所有内容并在本地查找重复项。

我认为你不能创建一个可以返回结果的表存储查询。据我所知,没有select … where count(select duplicates) > 1这样的东西 - 即使如此,那个查询也会很慢。除非我们讨论大量数据,否则只需查询所有内容并在本地过滤就可能表现得更好。

正如我所说,你只有糟糕的选择。那是因为Table Storage不是为这样的查询设计的。与SQL表不同,表存储表的设计应考虑到查询,即您应该知道在设计表之前如何查询表。

您的第二个选择是迁移到Azure SQL,此类查询完全没有问题。 Azure SQL与表存储非常不同,因此它是否符合您的要求是值得怀疑的。

编辑:优化查询的一种方法 - 所有解决方案都只返回实体的LastNames(+ Partition / RowKey或其他任何需要的内容)。这样,正在发送的数据量可能会减少很多。 Here's一篇关于查询投影的文章,详细解释了这项技术。

答案 1 :(得分:0)

获取所有记录的查询应为

PartitionKey eq 'Your PartitionKey' and LastName eq 'Smith'

除非我遗漏了什么。

您还需要考虑表继续令牌。有关详细信息,请参阅此主题:Copy all Rows to another Table in Azure Table Storage。正如@enzi所提到的,表存储中没有Select * from table where ...功能。