none
請問大資料量時,dataset實用嗎? RRS feed

  • 問題

  • 雖然說dataset是用來離線邊修資料用的,不過我發現,如果資料庫中的資料量有上千萬筆,每次要Fill到dataset中,大概是絕對不可能的事,這動作恐怕會讓使用者欲哭無淚吧?

     

    TableAdapter->ClearBeforeFill這個屬性是說要Fill動作之前,先清除dataset中的資料嗎?如果是這樣,是不是每次Fill都要等很久呢?

     

    我有兩張資料表,透過一個DataRelation把他們關連在一起。本來我是利用Data sources來產生具有data binding的data form,不過我想,如果資料庫的資料上千萬筆時,一開始在form Load時就Fill dataset中的資料表似乎不是太好的方法,所以我取消了一開始的Fill動作,但是由於我在新增主資料表資料時,要透過DataRelation新增子資料表的多筆"row"紀錄,而兩個資料表間的關聯欄位,在主資料表是AutoIncrement的欄位,所以在新增子資料表紀錄時,關聯欄位處就必須填入主資料表中那個自動編號的欄位的資料。但是,在資料還沒有傳回資料庫前是無法得知主資料表的流水編號到底是多少,所以新增子資料表的資料就產生了困難。

     

    如果一開始在form Load時就充填dataset的資料,雖然就可以避免這種尷尬的問題,但是如果主資料表的資料上千萬筆,這樣的動作造成的結果恐怕不是使用者願意面對的吧?

     

    之前有想過使用BindingSource->count來取得所有資料的總row數,但是後來發現,所謂BindingSource似乎不是直接binding到原來的資料庫上,而是binding到dataset上,所以如果我的DataAdapter沒有Fill,則取回的count就是dataset中的row數而不是原始資料庫中資料表的row數。

     

    請問如果我要新增主資料表的紀錄,同時新增子資料表的紀錄,但是又不想把資料庫中兩個表的資料都抓回來,我應該怎麼做比較好呢?

     

     

     

     

     

     

    2008年3月30日 上午 09:55

解答

  • 不是本來就不應該填到DataSet,而是本來就不應該讀那麼多資料.

    你有要讓User 去新查刪修你才要放到DataSet,單純做View 就用 DataReader.

    另外你有去分析User怎麼操作嗎?

    有人會去改千萬筆資料嗎?有人要去分析千萬筆資料嗎?

    使用者要什麼,給什麼才是資訊系統,我要修/查第55000筆資料,就讀 55000資料, 我要 100-2000 就給他 100-2000,我要 2005-2006 統計,就做統計給他. 不是說我要 55000 你讀100萬筆,然後User慢慢等,然後下一頁,下一頁按到第5500頁後再去修改.

     

    2008年3月31日 上午 12:57

所有回覆

  • 本來就不應該把所有的資料都填到 DataSet,理由有:

     

    1. DataSet 會佔記憶體,千萬筆資料會佔的記憶體很可觀吧。

    2. DataSet 不像 DBMS,有方便的 SQL 與查詢最佳化能力,速度會比 DBMS 慢很多。

    3. DataAdapter.Fill(),名稱就已經告訴你 "填滿",一定是先清空才填資料的啊。

     

    DataSet 可以用在 Local Cache,但不能拿來當真正的資料庫,那會很慘。

     

    2008年3月30日 上午 10:08
    版主
  • 不是本來就不應該填到DataSet,而是本來就不應該讀那麼多資料.

    你有要讓User 去新查刪修你才要放到DataSet,單純做View 就用 DataReader.

    另外你有去分析User怎麼操作嗎?

    有人會去改千萬筆資料嗎?有人要去分析千萬筆資料嗎?

    使用者要什麼,給什麼才是資訊系統,我要修/查第55000筆資料,就讀 55000資料, 我要 100-2000 就給他 100-2000,我要 2005-2006 統計,就做統計給他. 不是說我要 55000 你讀100萬筆,然後User慢慢等,然後下一頁,下一頁按到第5500頁後再去修改.

     

    2008年3月31日 上午 12:57
  • 嗯嗯,謝謝兩位大哥的說明,所以如果針對我主從資料表要新增資料的問題,如果要新增子資料表的資料(關聯到父資料表的AutoIncrement欄位),正確的作法是不是應該先把資料填入父資料表空的data schema(dataset?),然後再將dataset中的資料更新到資料庫中,接著取回資料庫中該筆row的正確流水編號後,再根據這個編號進行新增子資料表的紀錄?請問如果是這樣的話,我需要怎樣作才能把資料填入dataset中,並且在填完以後更新到資料庫中呢?

     

    之前我有嘗試使用具有databinding能力的控制項去關聯到dataset中,然後使用DataAdapter->update(mydataset->mytable)去試著更新資料庫,不過後來發現並無法寫入資料庫中。後來嘗試使用DataConnection, DataCommand, 以及DataParameter利用寫sql指令的方式去更新資料庫,不過我發現mysql connector.net的使用上要設定DataParameter不是那麼順利,不知道是不是有前輩使用過的可以提供些參考資料呢?

     

    謝謝大家的幫忙。

     

     

    2008年3月31日 上午 05:59
  • 這個問題在討論區已經討論很多了,雖然題目不同但都是關於AutoIncrement這個問題.

    雖然我認為你去看看是有參考的價值,但不一定是最佳的解法,我目前也還在找(我 ADO.NET,DataAccess Block,自訂物件,LINQ都玩過),也一直在改,但我不用AutoIncrement方式,因為我寫的都是最少好幾十人操作,用AutoIncrement會衝到,所以我都用GUID,另外Mysql 我沒用過,不給意見.

     

    1.整個問題最重要的是資料量太大,所以你要分析使用著真正要的是什麼,而不是從資料庫著手.

    2.Master Detail 操作時也不一定要 Master, 有時轉個 Detail To Master 也是行的, 不然像 Master To Detail To Detail To Detail 怎麼玩.你只要能抓到 Master 的 ID 值就好了,不用整個 Master 都抓,在設計表單時也可以先做設定檔,在做主表,再做副表,再做子表...分多次操作.

    3.資料切割,資料重組.....依據不同的使用者,給不同的資料,依據不同的使用者給不同的View, 不要說將所有的資料放在同一個Table 裡,然後全部的人一起用.

    4.分析重於設計,設計重於實做.

     

    2008年3月31日 上午 09:56
  • 嗯,guid確實是個好方法,不過沒用過,不知道大大可以示範一下如何產生guid嗎?

     好說 寫信:

    這個問題在討論區已經討論很多了,雖然題目不同但都是關於AutoIncrement這個問題.

    雖然我認為你去看看是有參考的價值,但不一定是最佳的解法,我目前也還在找(我 ADO.NET,DataAccess Block,自訂物件,LINQ都玩過),也一直在改,但我不用AutoIncrement方式,因為我寫的都是最少好幾十人操作,用AutoIncrement會衝到,所以我都用GUID,另外Mysql 我沒用過,不給意見.

     

    1.整個問題最重要的是資料量太大,所以你要分析使用著真正要的是什麼,而不是從資料庫著手.

    2.Master Detail 操作時也不一定要 Master, 有時轉個 Detail To Master 也是行的, 不然像 Master To Detail To Detail To Detail 怎麼玩.你只要能抓到 Master 的 ID 值就好了,不用整個 Master 都抓,在設計表單時也可以先做設定檔,在做主表,再做副表,再做子表...分多次操作.

    3.資料切割,資料重組.....依據不同的使用者,給不同的資料,依據不同的使用者給不同的View, 不要說將所有的資料放在同一個Table 裡,然後全部的人一起用.

    4.分析重於設計,設計重於實做.

     

    2008年4月1日 上午 11:54