2011-09-25 39 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的更快實施。