0

如何查询Azure Table Storage重复值?

假设该表包含一个名为“LastName”的列,并且有几个彼此相等的姓氏。string在不知道或拥有包含姓氏值的特定内容的情况下,如何查询?

编辑 一个例子是:

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

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

4

2 回答 2

2

作为一般经验法则:不包含PartitionKeyor的查询RowKey不会执行得很好。

我假设您的LastName列既不是 Partition-也不是 RowKey。在这种情况下,您只有不好的选择。表存储的工作方式是将分区的实体存储在一起,因此最快的查询是那些包含您要查找的实体的分区键的查询。由于您不能在任何其他列上建立索引,所有不包括 RowKey 的查询都将是分区扫描,即根本不会执行良好,因为必须分析该分区的所有行。

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

我认为您不能创建会返回结果的表存储查询。据我所知,没有这样的东西select … where count(select duplicates) > 1——即使是这样,那个查询也会很慢。除非我们谈论的是海量数据,否则简单地查询所有内容并在本地进行过滤可能会表现得更好。

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

您的第二个选择是迁移到 Azure SQL,这样的查询根本没有问题。Azure SQL 与表存储有很大不同,因此它是否符合您的要求值得怀疑。

编辑:您可以优化查询一切解决方案的一种方法是只返回您的实体的姓氏(+ Partition/RowKey 或您需要的任何其他内容)。这样,发送的数据量可能会减少很多。是一篇关于查询投影的文章,详细解释了这种技术。

于 2013-09-01T15:30:25.393 回答
0

获取所有记录的查询应该是

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

除非我错过了什么。

您还需要考虑表延续令牌。有关详细信息,请参阅此线程:将所有行复制到 Azure 表存储中的另一个表。正如@enzi 提到的,表存储中没有Select * from table where ...可用的功能。

于 2013-09-01T19:29:49.017 回答