クライアントサーバ型アプリケーションの最適化

クライアントサーバ型アプリケーションの最適化


通常クライアントサーバ型アプリケーション(特にデータベースアプリケーション)では、サーバマシンの性能(特に処理速度)を気にして作りません
したがって、クライアントマシンの性能は最低限のモノであると仮定しているとも言えます
纏めると、下記のような事を前提にしているかと思われます

  1. サーバの性能は現時点での仕様のモノを動かしても何ら遜色ないモノを使用している
  2. クライアントマシンの性能は開発したソフトウェアが動く環境の内での最低のモノである可能性がある(これは、たとえば、「推奨環境」ではなく「動作可能環境」を示しているのと同意語であると言えるでしょう)
  3. サーバとクライアントの間の回線はデータ移動時間なしにデータが動いているモノとして考える(データ移動時間はありますが、通常では考えません)

さて、この内でパフォーマンスに影響するのはどこでしょうか?
答えは全部です
ですが、通常は「1.」が最も影響すると言えるでしょう
また、「3.」も結構大きく影響する事がありますが、通常ではLANであるためそう多くは影響を及ぼす事はありません

したがって、パフォーマンスの改善は「1.」を重点的に行なう事となります
一番手っ取り早いのはやはりサーバーの性能を上げる事ですがそうも行かない事が多いのもまた現状といえます
たとえば、データベースアプリケーションの場合であれば、Indexを効果的に使用したりします
また、「2.」の性能を上げて「推奨環境+α」としてクライアント側での処理を多くする事もよく使われます

ここでは、後者を例に上げてみましょう
ここでの前提条件は、下記の二つです

それでは、どうすれば解消するのかを順に書いて行きましょう

  1. 「必要なデータだけ」を取得するのではなく、「必要なデータを含んだ状態」で取得する(その後、「不必要なデータ」を排除する)
  2. 必要であればそのデータを加工する
  3. サーバ側のデータ更新を行う場合は一括処理を行う
  4. 変更する箇所は最小限とする

こんな感じでしょうか、それではそれぞれについて補足して行きましょう

  1. この「必要なデータを含んだ状態」というのは別に「必要なカラムを含んだ状態のレコード」という意味だけではなく、「必要なレコードを含んだレコード群」という意味もあります
  2. この時の加工は、クライアント側の処理で行うモノとします
    したがって、できる事とできない事の区分けが必要です
  3. 移動するデータが多くても更新作業が一括で行われればその分同じ処理を何度も繰り返さなくてもいいぶんだけロスが少なくなります
  4. 変更する箇所を最小限におさえる事によって、移動データが減ります
    また、変更する箇所が少なければ、その分しなければならない処理が少なくなります

他にも、たとえば、INSERT+DELETEよりもUPDATEの方が遅いのであれば常にINSERT+DELETEで更新するとかも考えられます

こうやってある意味無駄とも思える最適化の方法を羅列して行き、その中で使えるモノを振り分けて行きます
これらの振り分けは、この他の環境で使えるとも限りませんのである意味で一発モノであると言えるでしょう

 

戻る