投稿者 魔界の仮面弁士  (社会人) 投稿日時 2017/8/31 19:29:17
概念論でしか述べられない質問内容なので、なかなか答えにくいところですが:


> ②検索条件入力部に条件を入力し、フォーム上の検索ボタン押下
> ③条件のSQLが発行され、DBから取得した検索結果が画面に表示される
> ②③の処理を再度実行しているのですが、あまりにも再表示に時間がかかる為、


データ取得がどのような形で行われているのか、データ表示手順はどのようなものなのか。
どう見直すべきかは、実際のコードを見ないとアドバイスできませんので、掲示板上では
一般論でしか言えませんが、今回の場合、「SQL の実行」に時間がかかるのか、
DataTable 取得後の表示処理に、どの程度の時間がかかるのかを調査すべきかと思います。

また、検索条件によって取得されるデータ量が多いときと少ないときで、
どの程度の時間差が生まれるのかも調査してみてください。


データ量の差で大きな時間差があるようであれば、差分処理によって
「必要最小限」のデータのみを取得するようにすることで、
処理時間を軽減することができるかもしれません。
(逆に、差分確認部分がボトルネックになって、悪化する可能性も無いとはいえませんが)

一方、データ量の差による違いがそれほどでもなく、
SQL の実行時間の方が圧倒的に長いようなケースであれば、
それはデータベース側のチューニングを施すのが先であり、
VB 側の処理を見直したところで根本解決にはならないと思います

あるいは、そもそも DataTable を使うことがボトルネックになっていて、
ファイアホースな DataReader で得た情報を Dictionary に保持したほうが
高速になるといったケースさえあります。


―――ということで、パフォーマンスを見直す場合には、まずは
コードのどの行がボトルネックになっているのかを測定するのが肝要です。

基本的にはもっとも時間がかかっているところから見直すのが定石ですが、
一行一行の処理時間が一瞬だったとしても、それがループ処理の内側にあるものなら、
僅かな高速化でも効果があるかもしれません。ケースバイケースですよね。



> 現在、④の更新後、⑤で更新内容を画面に再表示させる為に、

そもそも、④の更新はどのように行われているのでしょうか。
ストアドプロシージャーなのか、アドホッククエリーなのか。
一行単位での更新なのか、複数レコードに対する一括 Update な SQL なのか。

前提条件が分からないので、どう差分を取るかも答えにくいですが、
とりあえず差分判定ということなら:

案1)更新結果を一時テーブルに保持しておき、サーバー側で差分 SQL を発行する。(EXCEPTなど)

案2)影響を受けるレコードが限定されているなら、ファイアホースな DataReader で
 取り出して、クライアント側で順次探索して表示に反映していく。

案3)2 つの DataTable を比較するのなら、行数が同じなら SequenceEqual、
 削除や追加がありえるなら、Linq 等で Dictionary 化して付きあわせる。
 http://temochic.com/?p=81
 https://social.msdn.microsoft.com/Forums/ja-JP/ced9e34b-6df8-46f7-a09e-d63483758e7b/datatable



で、データベース側で確認するところとしては:

・実行プランからボトルネックを探ってみる。
 たとえば、Index Seek 後のキー参照が高コストになっている場合は、
 付加列インデックスの利用を検討してみるなど。


VB との連携で考えてみるなら:

・結合テーブル数が多いと時間がかかるが、テーブル数が少なければ十分早い場合は、
 結合度を減らした別々の問い合わせに分解して、まとめて DataSet に蓄えてから、
 VB 側で DataRelation あるいは LINQ で結合することをケントウするなど。