tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^4: フォーム内に配置した複数のComboBoxのリストについて
投稿日: 2010/01/07(Thu) 16:56
投稿者るしぇ
> MDB接続した後に、後処理としてDisposeしているので
> Closeした後も同じように時間がかかります。
よく勉強されてますね。
ただ、Dispose も微々たる物ですけどね。
あんまり関係ないと思います。

まず、データベースに初回接続時は時間が掛かります。
ここで1秒前後掛かる事は仕方なしと思ってます。
# 今、再度同じテストプログラムを実行したら1.3秒
# 掛かりました。
で、一度接続した場合、「接続プール」という考え方が
ありまして、これはコードで Close した Dispose した
とは別次元の話になります。OS レベルで1度起動した
アプリはメモリ上に残っていて2回目の起動が速くなる
ということがありますので、知識として知っておいて
下さい。アプリのレベルでここを制御する事は、まず、
ありません。
データベースにも一度検索された条件・データはメモリ
上に保持され、2回目以降速くなる機能があります。
アプリで制御することはありません。データベースの
機能です。

しかし、質問内容から、初回のフォームロード時の話
ですから、どうやっても1秒前後は掛かる。
最終的に2秒前後なら、まぁ、アプリとしては合格ライン
ではないでしょうか?

ここから改善するには、フォームロード時には接続だけ
開いておいて、コンボボックスクリック時にそのコンボ
ボックスのデータだけ検索に行く(もちろん初回だけ)
とかいうトリッキーな設計でも考えないと無理な気が
します。

それは置いておいて、もっと基本的なところは押さえて
あるでしょうか?。

速くするには単純にデータ量を少なくすればいいです。
DisplayMember で表示するデータを決めていますが、
他のデータは全て使うのですか?
使わないデータなら、データベースから取り出さなくて
いいですよね?テーブル丸ごと取り出しているのなら
必要なデータだけ取り出すことで速くなります。

テーブル設計はどうでしょう?主キーは?インデックスは?
要求したデータをデータベースが返す時間は最適化
されていますか?

あとは、コンボボックスの描画、データの読込みでも
改善できる可能性はありますが、100件程度のデータでは
必要ないと思いますので省略します。

そういったノウハウを注ぎ込んで、0.5秒から1秒くらい
短縮できる可能性はあるでしょう。

ここまでくると仕様上コンボボックスで選択したレコードの
データを全部使うためにあらかじめ検索してるとかだの
プログラミング設計も関係してきます。
主キーだけ検索しておいて、コンボボックス選択時に
該当データだけ検索しなおすような、根本的な設計改善が
必要になります。

>どうやったらNo.9765のように早く処理できるのでしょうか?
特別なことはしてません。基本を押さえて単純なテーブルを
たるさんの出された条件どおり実行しています。
DataReader にさえしてません。

        Dim Cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Database\Test.mdb")
        Dim SQLCm As OleDbCommand = Cn.CreateCommand
        Dim Adapter As OleDbDataAdapter
        Dim dt As DataTable
        Dim sTime0 As DateTime = Now
        Dim eTime0 As DateTime

        Cn.Open()

        SQLCm.CommandText = "SELECT フィールド1 FROM テーブル1"
        Adapter = New OleDbDataAdapter(SQLCm)
        dt = New DataTable
        Adapter.Fill(dt)
        Me.ComboBox1.DataSource = dt
        Me.ComboBox1.DisplayMember = "フィールド1"

        SQLCm.CommandText = "SELECT フィールド2 FROM テーブル2"
        Adapter = New OleDbDataAdapter(SQLCm)
        dt = New DataTable
        Adapter.Fill(dt)
        Me.ComboBox2.DataSource = dt
        Me.ComboBox2.DisplayMember = "フィールド2"

        ’コンボ10まで同様のため、省略

        Cn.Close()

        eTime0 = Now
        Debug.WriteLine(eTime0.Subtract(sTime0).TotalSeconds & " 秒かかりました。")


あ、実力は魔界の仮面弁士さんの方が上なので、更に極めたいならもう少し頑張ってください。
ボクが提供できる情報は以上です。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。