C# 从Azure表存储中获取重复值

C# 从Azure表存储中获取重复值,c#,azure,duplicates,azure-storage,C#,Azure,Duplicates,Azure Storage,如何在Azure表存储上查询重复值 假设该表包含一个名为“LastName”的列,并且有几个LastName彼此相等。我如何在不知道或不拥有包含lastname值的特定字符串的情况下查询它 编辑 例如: Partitionkey RowKey LastName 1 1 Smith 1 2 Smith 1 3 Smith 1 3 MILLER 1 3

如何在Azure表存储上查询重复值

假设该表包含一个名为“LastName”的列,并且有几个LastName彼此相等。我如何在不知道或不拥有包含lastname值的特定字符串的情况下查询它

编辑 例如:

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

在这种情况下,我希望获得所有记录,其中Smith是姓氏,因为它们是重复的。

一般经验法则是:不包括PartitionKey或RowKey的查询将无法很好地执行

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

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

我认为您不能创建一个返回结果的表存储查询。据我所知,没有选择这样的事情…其中countselect duplicates>1–即使是这样,查询也会非常慢。除非我们讨论的是大量数据,否则简单地查询所有内容并在本地进行过滤可能会表现得更好

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

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


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

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

PartitionKey eq 'Your PartitionKey' and LastName eq 'Smith'
除非我遗漏了什么


您还需要考虑表延续令牌。有关详细信息,请参阅此线程:。正如@enzi提到的,没有Select*from表,其中。。。功能在表存储中可用。

您能举个例子吗?请看我的问题,它是用一个例子编辑的。只是澄清一下:没有行键的查询将导致分区扫描,而不是表扫描。我忘了提到查询将在某个分区中执行。大卫·马科贡:你说得对,当我说表格扫描时,我应该澄清一下。我会更新答案。@Quoter:即使这样,目前也无法创建这样的查询。有一些方法可以解决这个问题,但它们在很大程度上取决于您的应用程序-我们需要更多的上下文来帮助您。例如,您可以以冗余方式存储查找数据,例如,以LastName作为RowKey和count作为值存储附加行,并在插入和删除操作中增加或减少该计数。这会使DML操作变得非常复杂,更不用说同步风险了,但它会极大地提升您的查询。这里有很多陷阱,如果你的插入/删除次数比[cont.]查询次数多,那就不值得了。如果有其他选择,我会避免这样做,但由于存储成本低廉,而且如果您执行的查询比DML操作多得多,这种方法可能是值得的。再说一次,如果SQLAzure是您的选择,我更喜欢它。您必须执行许多类似的查询吗?如果您确实需要这些查询,也许您可以研究SQL Azure和分片而不是表存储?我知道这个查询可以工作,但我的问题是,我不知道哪些姓氏是重复的。查询本身应该找出哪个姓氏是重复的。那么,这似乎是不可能的?