2011-09-25 37 views
1

我在SQL SERVER中有一个分区表,在ID上有一个聚集索引,并且该表由period_key分区。该ID在分区内是唯一的,但不是唯一的交叉分区。我需要的是找到所有的唯一ID。最简单的方法就是使用如何从C#中的数据库中排序多个排序的数据集?

select unique ID from tab 

但是,这需要在哪些需要放弃很多临时磁盘的数据库DB进行排序,因此需要大量的磁盘IO的。由于系统已经是IO界限了,我正在考虑削减磁盘IO。由于我们可以通过使用簇索引按顺序读取每个分区,假设我们有10个分区,我们可以从每个分区读取一行,然后比较它们,并使用最小ID输出记录,例如从分区X开始,然后读取分区X的下一行。再次比较这10行,输出带有最小ID的记录等。就像外部排序一样。

我没有C#的经验,但知道java。任何人都可以给我一些想法如何在C#中实现它?

+1

c#在这里有什么作用?你想要一个linq-to-sql解决方案?我很难想象一个解决方案多次往返数据库比在sql server本身优化的一个查询更好。或者我错过了你的观点? –

+0

你想消除重复项('从选项卡中选择不同的ID),或者你想只得到这些只有一个发生的ID? –

回答

1

好的,如果要求是绕过数据库服务器端的排序,而不是在客户端识别一个ID是唯一的,那么可以这样做 - 选择所有ID值(不区分在查询):

SELECT ID FROM tab 

通过所有的值,那么循环,将其添加到List。完成之后,您可以要求清单在移除重复项的情况下返回自己的版本。这里有一个简单的例子:

List<int> allIDs = new List<int>(); 
foreach (DataRow row in someDataSet.Tables[0].Rows) 
{ 
    allIDs.Add((int) row["ID"]); 
} 
List<int> uniqueIDs = allIDs.Distinct(); 

免责声明 - 我写了我的头顶,所以它可能包含错误。 This post包含基于HashSet的更快实施。