如何在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姓氏的所有记录,因为它们是重复的。
答案 0 :(得分:2)
作为一般经验法则:不包含PartitionKey
或RowKey
的查询效果不佳。
我假设您的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 ...
功能。