コンボボックスのデータ読み込み
お世話になります。
現在開発しているプログラムでは、1フォームに10個くらいコンボボックスを使用することがあり、そのプログラムを呼び出した際、タスク前に行くまでに非常に時間がかかります。コンボボックスはデータを参照しており、インデックスも適切に設定しています。レコード数も多くありません。現在は宣言を使用して読み込み時間を分散しているのですが、できるだけ待ち時間を減らしたいです。何かいい方法があったり設定で時間を短縮できたりしないでしょうか。ご教授頂けますと幸いです。
遅延トランザクション・SQL Serverです。
-
KMさん、
コンボボックスでのリンクは照会リンクとほぼ同じ負荷ですので、10個くらいでそんなに重くなることはないと思うんですが。。。
何となく、原因が他にあるような気がします。
重いなあって感じる時の、サーバのメモリの使用状況はいかがですか?90%とか行ってませんか?タスクマネージャで確認してみてください。
-
Tandaさん
タスクマネージャーを確認しながら動かしてみましたが特にメモリ使用率が跳ね上がったりはしませんでした。
わかっていることとしては、親タスクに何かしらメインソース指定→コンボボックスを複数並べた子タスクを呼び出すと子タスクのタスク前までに時間がかかり、メインソースを指定していない親タスクから同様の子タスクを呼び出した場合は時間がかかりません。
コンボボックス8個で7~9秒くらい待機時間があります。
同僚に試してもらった時も同じような現象になったので、自分の環境のせいではないと思っていたのですが、何がボトルネックになっているのでしょうか…
-
KMさん、
ということは、コンボボックスのリンク自体には負荷が掛かっていないということですね。
メインソースのあるタスクから、その子タスクを呼び出すときの条件設定(位置付け等)には問題ありませんか?キーが正しく効いていなくて、総舐め検索になってしまっているとか。。。
-
Tandaさん
テストプログラムでは、親タスクに適当なメインソース、子タスクにはメインソースを設定しておらず、コンボボックスのための変数を複数用意しているだけですが、上記の待機時間が発生します。
テストしながらもう1つ分かったことは、データベースの設定→SQL→テーブルの存在チェックを外すと待機時間がかなり減るということです。
-
KMさん おはようございます。
私がコンボボックス用に行ってる処理を紹介させていただきます。
以前、当フォーラムでどなたかに教えていただいた方法なので私のオリジナルでは有りません。
納品した何社かのシステムで利用している方法です。メインプログラムのグローバル変数に10レコード分のキー値・データが収容できる以上の長さのテキスト項目を定義します。
メインプログラムのタスク前処理でコンボボックスセット用のプログラム「コンボセットA」をCALLします。
「コンボセットA」ではメインソースにコンボボックスにセットするテーブルを指定します。
レコード後処理でグローバル変数にキー値・項目データをセットしていきます。
1件目 LTrim (Str (キー-値,'#2Z'))&':'&RTrim (項目データ)
2件目以降 RTrim (グローバル変数)&','<rim (Str (キー値,'#2Z'))&':'&RTrim (データ項目)
グローバル変数には 1:分類A,2:分類B,3:分類C‥‥等のようにセットされます。
※対象テーブルはキーが数値2桁を想定しています。コンボボックスを表示するプログラムのフォームにフォームコントロールのコンボボックスを
貼り付け、
データ→セットする対象テーブルの項目(コンボボックスのキー値又は文字データの項目)
選択項目リスト→ 1,2 式でグローバル変数を指定
表示項目リスト→ 1,2 式でグローバル変数を指定以上の方法で各種プログラムで同じテーブルのコンボボックスを利用しています。
コンボボックス用にテーブルを読み込むのはメインプログラム起動時の初回のみですので
待ち時間が発生することは無いと思います。 -
補足です。
前記の方法はV10、Unipaas、xpa3で行っています。xpa4では実績が無いことをお断りしておきます。 -
Nagashimaさん
ありがとうございます。
たしかにそのやり方でしたら、初回の読み込みだけで済みますね。
今回の現象が私の環境や設定が要因なら何か改善したいのですが、仕様として時間がかかるということでしたらご教示頂いた方法でやってみようと思います。
-
KMさん、
「テーブルの存在チェック」はすべてのプログラムのパフォーマンスに対して有効ですので、ある程度は早くなると思います。
ただ、親タスクにメインソースがあるか無いかの違いで速さが変わるというのが、ちょっと腑に落ちませんね。。。
-
1フォームに10個ほどのコンボボックスで、コンボボックスにデータを指定しているとの事ですが、コンボボックスに表示される件数は何件ぐらいなのでしょうか?
-
売上明細データ 56万件をメインソースにして
得意先コードで 得意先マスタ(450件)
担当者コードで担当者マスタ (10件)
商品コードで商品マスタ (8000件)
拠点コードで拠点マスタ (1件) をコンボボックス表示する
スクリーンモードのオンラインタスクを実行すると、データが表示されるまでに
9秒~10秒ぐらいかかりました。
uniPaaS V1 Plus、xpa 3.2で同じプログラムを実行してみましたがどちらも似たような速度でした。
SQL Serverです。
(商品コード、商品マスタを削ったら即開きました。) -
nkmtさん
テストプログラムですが、コンボボックス10個で表示件数は合計40程です。
-
KMさん
SQLSERVERへの接続はIPアドレスを指定していますか?
Windows11 24H2環境でサーバー名を使用してSQLSERVERに接続していると極端に遅くなる現象が発生しました。
その時はIP指定またはhostsの設定で回避できました。
-
AY001さん
ありがとうございます。
SQL Serverはサーバー上ではなくローカルのEXPRESSを使用しています。
納品時はサーバー上に構築しますので、参考にさせて頂きます。
-
コンボボックスにデータを指定している訳ですが、範囲も指定がありますか?

-
nkmtさん
範囲指定はなく、純粋にレコード数が数行程度のものをつかってテストしています。
-
本件、SQL Serverのexpressでテストしていたのですが、standard上の別のデータですが、同じような条件で試したところ早かったです。メモリ使用制限の問題なのでしょうか。
-
Express上のデータを
Standardへ復元して同じテーブルでの比較も良いのかもしれませんね。 -
Standardでは一回読み込んだデータはメモリー内に残されているみたいで、何度も読み込み様な処理では
処理が早くなっているようでした。
ExpressからStandardにアップグレードした顧客での体感速度は倍以上早く感じました。
Expressはメモリー使用量が1GB迄だったので、データボリュームが大きいシステムではキャッシュが
効きにくいのかもしれませんね。 -
Ace_Nagashimaさん
私のユーザー様はExpressからStandardへの乗り換えがほぼなかったり
ExpressからStandardへの乗り換えはハード交換の時だったりで
両者の違いを体感する機会が少ないですが、体験談を教えてくださり
ありがとうございます。 -
Nagashimaさん
貴重な情報を教えて頂きありがとうございます。
今回はユーザ側でSQL Serverをご用意いただく予定になっておりますので、頂いた情報を交えてご説明しようと思います。
-
KMさん、
それは、同じマシン上での比較でしょうか?どれとも別マシン上にあるStandard版との比較でしょうか?
特定のWindows Updateが入っているかいないかの違いも、可能性としてあるような気がします。
-
Tandaさん
同じPC上での比較です。
時間ができたら共通のDBを使ってそれぞれのSQL Serverでの速さを比較してみたいと思います。
-
先ほど同じデータを使って同じプログラムを動かしてみましたが、Standardの方はほぼ待ち時間がありませでした。Expressだとコア数制限があるのでクエリを並列処理で捌けず待ち時間が長くなるのでしょうか。キャッシュが効くかの差もありそうです。
皆様色々とご教授頂きありがとうございました。
サインインしてコメントを残してください。
コメント
23件のコメント