Board logo

主題: [其他] [求助]請教 VB.NET 2005 DataGridView 的效率 [打印本頁]

發表人: htkstw    時間: 2007-2-16 06:53 PM     主題: [求助]請教 VB.NET 2005 DataGridView 的效率

剛想從 VB6 想跳至 VB.NET 2005 就遇到這個棘手的問題...

我用DataGridView顯示一個陣列清單的資料, 資料筆數是10000筆, 結果要等上7~10秒鐘才會顯示出來, 經過我找尋解決的方法後, 只要 VirtualMode 設成 True, AutoSizeColumnsMode 設成 None, 效率則可以大大的提升到瞬間即顯示出來.

現在我再用DataGridView直接連結oledb資料庫來顯示資料, 資料筆數是16000筆, 結果要等上10~15秒鐘才會顯示出來, 即使以上述方法也沒辦法有效率的立即顯示出來.

我在網路上找了好久, 一直沒找到關於這方面的資訊. 大陸那邊有人說過連結資料庫要顯示大量資料時, DataGridView 的效率是很差的, 這是真的嗎? 請問有沒有辦法解決?

謝謝.
發表人: steven211    時間: 2007-2-19 10:26 PM

這個問題跟我上次遇到的有點類似,
http://twed2k.org/viewthread.php?tid=131037&extra=page%3D1
我想主要的速度瓶頸是出在broser吧!
當broser接收網頁的Tag然後轉成我們可視的網頁時也是需要CPU下去處理的,
當你遇到資料一多時就是會發生這種問題,
你可以先打開工作管理員並在Load網頁的時候觀查看看CPU是否滿載,
你是做統計分析類的報表嗎?
不然可以嘗試用使用分頁顯示。
發表人: htkstw    時間: 2007-2-20 10:35 AM

糟了!也許是發在這一區, 讓你誤認為是網頁相關的程式問題, 其實不是, 純粹是windows應用程式的問題.

搞了這許多天來, DataGridView這個問題始終還是沒解. 真是讓我很奇怪, 怎麼大家都沒遇到這種狀況嗎? 如果真是這樣, 那應該是我個人寫程式的關係了, 只是一直找不到答案, 所以也一直卡在這裡.

我前天做了一個小實驗, 以3600筆6個欄位的資料來做, 一樣DataGridView繫結資料庫直接顯示出來要5~6秒(這也太離譜了!). 但是如果只用變數取出來, 不在DataGridView顯示, 則是立即就完成了, 這中間還需要先經過判斷是否為NULL值呢! 由此我判斷, 問題應該不在於資料庫物件, 而在於DataGridView物件本身了.

如果再參考到我上面說的第一例, 我想, 應該在DataGridView物件在取出資料並顯示的這一段過程的問題, 只是如何解決我一直找不到, 啊~~~~~太悲慘了!
發表人: ithinkurdumb    時間: 2007-3-3 04:24 PM

第一個問題是因為ADO.NET是針對SqlClient來開發的,
所以碰到OleDbClient的時候一定有performance penalty,
要是資料量狠大,
penalty會相當嚴重.
這也是為什麼Microsoft這兩年來一直在鼓勵developers把Windows Application的資料庫從Access改成SQL Express或是SQL Mobile.

其次是DataGridView本身的設計所造成的.
DataGridView是一個非常有彈性的架構,
不過預設並沒有對大量的資料做最佳化.
關於如何將DataGridView針對大量的資料做最佳化,
可以參考這篇MSDN: http://msdn2.microsoft.com/en-us/library/ha5xt0d9.aspx
其他的資料可以參考: http://msdn2.microsoft.com/en-us/library/ms171621.aspx

最後還有一點在某些情況也能夠大幅提高效能,
就是在能用DataReader的時候盡量用.
如果只是要從database把資料拉出來,
而且不需要排序 (或是能用sql query / stored procedure等等來排序),
就使用DataReader.
DataReader的效率是所有data access method中最好的 (而且超出其他狠多).

希望有幫助囉 ;)
發表人: dayi    時間: 2007-3-3 06:25 PM

先說明,我沒實做過.net的DataGridView
我是用java做過datagrid
在遇到大量資料時會"爆慢",十萬筆要等上一分多鐘
後來找出原因
是在於datagrid要滿足一個條件
"資料全部fetch到本端"
這時才會顯示
後來我就在datagrid上動手腳,給一個fetch row的變數 N
datagrid只要抓到N rows之後就當做完成,便把資料顯示出來
再利用元件本身是動態資料來源的特性,在後端繼續把資料丟到grid裡
這樣就可以達到效率和資料完整性的平衡

給您參考一下
發表人: ma1111    時間: 2008-3-29 07:41 PM

天下沒有白吃的午餐,
這種RAD導向的控制項效率一向如此,
重點在fetch cache的時間點及地方,
樓上有些建議是可行的
發表人: psycho    時間: 2008-4-4 11:48 AM

JAVA 可以用ajax和comet
來傳資料
發表人: soupjvc999    時間: 2008-4-18 02:25 PM

ithinkurdumb  與  dayi的方法不錯喔!!
受教了!!




歡迎光臨 TWed2k (http://twed2k.org/) Powered by Discuz! 4.1.0