2011-02-23 19 views
0

你好 我正在開發一個c#應用程序,用於選擇和比較數據庫上的一些數據,有超過500'000條記錄的表上。我正在使用mysql連接器,並且我將要做一個:哪個是mysql中用c#可選擇的最大行數?

SELECT * FROM table 

從那張表中。 我的問題是:建議使用select * without limit?如果我一次選擇所有500000條記錄,這個過程是否會產生問題,或者我應該限制用戶選擇組中的記錄? 我問,因爲在VB中,我遇到了這種選擇的問題,使停止程序。

謝謝大家。

編輯:我選擇功能:

public Object[] QuerySelect(String query) 
{ 
    IDbCommand dbcmd = dbcon.CreateCommand(); 
    dbcmd.CommandText = query; 

    IDataReader reader= dbcmd.ExecuteReader(); 
    ArrayList result = new ArrayList(); 

    while (reader.Read()) 
    { 
     Hashtable ht = new Hashtable(); 
     int fieldCount = reader.FieldCount; 

     for (int i = 0; i < fieldCount; i++) 
      ht.Add(reader.GetName(i), reader[i]); 

     result.Add(ht); 
    } 
    reader.Close(); 

    return result.ToArray(); 
} 
+0

嗨,如果你準確地解釋你想要做什麼,你可以得到好的想法,如何正確地做到這一點,丹尼爾是正確的DataReader會比一次加載數據集上的一切,但我相信如果某些邏輯可以放在存儲過程中,或者可以使用滑動窗口方法完成,那就更好了。 – 2011-02-23 11:33:23

+0

我必須閱讀這些行,並且對於每一行我都必須檢查一些值,然後在特定條件下更新此值。我不需要查看這個結果,只需處理它們,在命令Promt應用 – albanx 2011-02-23 11:49:19

回答

1

我想你使用SqlCommand.ExecuteReaderSqlDataReader讀取數據。在這種情況下,它本身不是一個問題,因爲你會在循環中請求每一行。但是,如果您通過閱讀所有行並將結果放入列表中,那麼會出現問題,因爲您試圖將這500,000個項目放入內存中。

如果你不把行放在一個列表中,而是以某種方式處理它們,所以它們可以被垃圾回收後,你沒有問題。

更新:
您更新了您的問題並顯示了您正在使用的方法。這正是這種情況,會讓你陷入困境,因爲它會導致一個包含500,000個Hastable實例的ArrayList實例。

答案:
現在你應該使用泛型, List<T>Dictionary<TKey, TValue>而不是ArrayList和Hashtable。它使你的代碼類型安全。

+0

是的,我使用它們,然後我把結果放在列表中 – albanx 2011-02-23 11:51:10

+0

目前我在查詢中使用LIMIT。 – albanx 2011-02-25 07:28:21

0

這是由您來解決問題,不要強迫用戶拆分表或減少記錄數。

嘗試閱讀您感覺舒適的窗戶尺寸,並將其納入您的性能規格。例如,每次讀取100,000條記錄,處理它們,然後存儲它們並獲得下一組100.000。