C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: DbDataAdapterのFillを高速化したい


(過去ログ 27 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■12718 / inTopicNo.1)  DbDataAdapterのFillを高速化したい
  
□投稿者/ 緑茶庵 (1回)-(2008/01/15(Tue) 18:54:17)

分類:[.NET 全般] 

お世話になっております。

ツール:VisualStudio2005
言語 :C#.net
OS :WindowsXP sp2
DB :Oracle10g

の環境にて作成及び動作するWindowsアプリケーションで
データベースからの抽出結果を DataGridViewに表示しております。

データベースからDataGridViewへの表示は

------------------------------------------------------------------

//データ抽出
//※factoryはDbProviderFactory / commandはDbCommand で経緯は省略
DataAdapter dataAdapter = factory.CreateDataAdapter();
dataAdapter.SelectCommand = command;

DataTable dt = new DataTable();

//Fill実行  ※1
dataAdapter.Fill(dt);

//DataGridViewへデータを表示  ※2
dataGridView1.DataSource = dt;

-------------------------------------------------------------------


のように行っており、30000件ほどのデータを表示しようとすると
Fill実行部(※1)で30秒、DataGridViewへ表示(※2)で1秒の時間がかかります。

Fill部で時間がかかっているようですが、ここを高速化する何か良い方法はありますでしょうか?
全件をメモリに確保するのではなく、表示する分のみを確保する方法など・・

色々情報を検索しているのですが良い情報が見あたりません。

C#.net 初心者で申し訳ございませんが
よろしくお願いいたします。



引用返信 編集キー/
■12721 / inTopicNo.2)  Re[1]: DbDataAdapterのFillを高速化したい
□投稿者/ THREE-ONE (23回)-(2008/01/15(Tue) 19:47:34)
質問の内容とは少し異なりますが、DataReader 使って非同期で取得→表示するのがいいんじゃないですか?
Fillが使いたいなら、ある程度の速度のでる件数のみ取得して表示し、残りをバックグラウンドで順次取得というように、データ取得を分けてやるとか。
もしくは、Fillを非同期に実行して、Fill 対象の DataTable の RowChanged イベントで DataGridView を更新とか。
ちょっと、今試す環境がないのでアイデアだけですが、いかがでしょう。
引用返信 編集キー/
■12725 / inTopicNo.3)  Re[2]: DbDataAdapterのFillを高速化したい
□投稿者/ Tesla (1回)-(2008/01/15(Tue) 20:52:26)
試したことはないのですが、仮想モードで実現できませんか?

Windows フォーム DataGridView コントロールでの Just-In-Time データ読み込みによる仮想モードの実装
http://msdn2.microsoft.com/ja-jp/library/ms171624(VS.80).aspx
引用返信 編集キー/
■12802 / inTopicNo.4)  Re[3]: DbDataAdapterのFillを高速化したい
□投稿者/ 片桐 (60回)-(2008/01/17(Thu) 23:08:37)
片桐 さんの Web サイト
まず、Fillメソッドは取得結果をすべてメモリ(受け取り先のDataTable)に展開するので、SELECT→データ転送→DataTableへの展開、というステップを踏むことになります。画面への情報還元などを考えた場合、大量データを処理するには向かない処理方式です。

改善方法はいくつかあるのですが

1.Select句で画面表示に必要なデータだけを取り出せるようにSQLを改善し、SQLDataAdapterでFillする
2.SQLDataReaderを使って、必要なレコードだけを取得してDataTableへ展開する

がよく使われている方法ではないかと思います。

1.の場合には、データレコードに連番フィールドがあるならそれを使い、ないならrownumを使って画面表示に必要なレコードを絞り込んだSQLにして、AdapterにFillします

2.の場合には、SELECT→サーバー上のメモリに結果を展開→Readerで一行ずつ取得、という手が使えるので、画面表示に必要なレコードまで読み飛ばす方法になります

画面表示がある場合には1の方法が一般的かなぁ……「ページング」というキーワードで検索してみてください。

引用返信 編集キー/
■12808 / inTopicNo.5)  Re[4]: DbDataAdapterのFillを高速化したい
□投稿者/ medaka (1回)-(2008/01/18(Fri) 09:23:33)
お手軽な方法としては
Dim aa As DataTable = New DataTable
aa.RemotingFormat = SerializationFormat.Binary
を試してみてはどうでしょうか?
確か2005からの新機能だったような

引用返信 編集キー/
■12812 / inTopicNo.6)  Re[5]: DbDataAdapterのFillを高速化したい
□投稿者/ なちゃ (99回)-(2008/01/18(Fri) 10:03:24)
No12808 (medaka さん) に返信
> aa.RemotingFormat = SerializationFormat.Binary
> を試してみてはどうでしょうか?

いやそれは関係ないでしょう。
引用返信 編集キー/
■12823 / inTopicNo.7)  Re[6]: DbDataAdapterのFillを高速化したい
□投稿者/ medaka (2回)-(2008/01/18(Fri) 12:34:32)
http://www.microsoft.com/japan/msdn/net/adonet/datasetenhance.aspx
ここの情報からパフォーマンスアップに効果ありかなと思ったんですが
関係ないのでしょうか?
もしかしてSQL Clientの時だけなのかな
引用返信 編集キー/
■12833 / inTopicNo.8)  Re[7]: DbDataAdapterのFillを高速化したい
□投稿者/ 黒龍 (92回)-(2008/01/18(Fri) 13:39:12)
No12823 (medaka さん) に返信
> http://www.microsoft.com/japan/msdn/net/adonet/datasetenhance.aspx
> ここの情報からパフォーマンスアップに効果ありかなと思ったんですが
> 関係ないのでしょうか?
> もしかしてSQL Clientの時だけなのかな
データセットをシリアライズ(リモーティングで渡したりファイルに保存したり)する際に
なります。DBから取ってくるデータはもともとバイナリなので指定の有無は影響ないと思
われます。
引用返信 編集キー/
■12836 / inTopicNo.9)  Re[8]: DbDataAdapterのFillを高速化したい
□投稿者/ medaka (3回)-(2008/01/18(Fri) 13:57:11)
> データセットをシリアライズ(リモーティングで渡したりファイルに保存したり)する際に
> なります。DBから取ってくるデータはもともとバイナリなので指定の有無は影響ないと思
> われます。

了解です
読み違えてました
ありがとうございました

という事であれば自前でキャッシュするような仕組みとか
仮想モードを試すくらいしかなさそうですね
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -