从Azure表存储获取重复值
本文关键字:获取 存储 Azure | 更新日期: 2023-09-27 18:29:58
如何在Azure Table Storage
上查询重复值?
假设该表包含一个名为"LastName"的列,并且有几个姓氏彼此相等。在不知道或没有保存姓氏值的特定string
的情况下,我如何查询?
编辑例如:
Partitionkey RowKey LastName
1 1 Smith
1 2 Smith
1 3 Smith
1 3 MILLER
1 3 WILLIAMS
在这种情况下,我想得到史密斯姓的所有记录,因为它们是重复的。
根据一般经验:不包括PartitionKey
或RowKey
的查询不会执行得很好。
我假设您的LastName
列既不是Partition-也不是RowKey。在这种情况下,你只有糟糕的选择。表存储的工作方式是分区的实体存储在一起,因此最快的查询是那些包含您要查找的实体的分区键的查询。由于您无法在任何其他列上建立索引,因此所有不包括RowKey的查询都将是分区扫描,也就是说,由于必须分析该分区的所有行,因此根本无法正常执行。
在您的情况下,如果您正在查找所有包含重复值的列,那么最好的选择可能是查询所有内容并在本地查找重复值。
我不认为您可以创建一个表存储查询来返回结果。据我所知,不存在select … where count(select duplicates) > 1
这样的东西——即使是这样,查询也会非常慢。除非我们谈论的是大量的数据,否则简单地查询所有内容并在本地进行过滤可能会更好。
正如我所说,你只有糟糕的选择。这是因为表存储不是为这样的查询而设计的。与SQL表不同,表存储表的设计应该考虑到查询,即在设计表之前,您应该知道如何查询表。
您的第二个选择是迁移到Azure SQL,在那里这样的查询根本没有问题。不过,Azure SQL与表存储非常不同,因此它是否符合您的要求值得怀疑。
编辑:优化查询-所有解决方案的一种方法是只返回实体的LastNames(+Partition/RowKey或您需要的任何其他名称)。这样,发送的数据量可能会减少很多。下面是一篇关于查询投影的文章,详细解释了这种技术。
获取所有记录的查询应该是
PartitionKey eq 'Your PartitionKey' and LastName eq 'Smith'
除非我错过了什么。
您还需要考虑表延续令牌。有关更多详细信息,请参阅此线程:将所有行复制到Azure表存储中的另一个表。正如@enzi所提到的,表存储中没有可用的Select * from table where ...
功能。