クライアントサーバでの高速化のアイデア1

リストボックスを使ったフォームに一覧を表示しようとしていたり、集計結果を表示するなど、アプリが遅い、状態になることがある。スタンドアロンで開発しているとDBとのやりとりが多少多くても瞬時に表示されてしまうので遅い実装をしていることに気づかない。できたアプリをクライアントサーバ(C/S)で実行してみると遅すぎてダメなことはよくある。そんなときに使えるアイデアを紹介。

基本となる考え方は、

1)クエリーの回数を減らす

2)転送の回数を減らす

これが大原則、このために使えるテクニックを紹介する。

たとえば請求書のテーブルを月度で集計してフォームに1年分の集計表を表示する場合を考えてみる。年度と月度でクエリーしてsum()関数で金額を集計すると12回のクエリーが発生する。query部分をモデルメソッドで実装することでコードはスッキリ、わかりやすい。請求書が何年分も溜まっていると大量にデータがあるDBに対して12回のクエリーを実行することになる。

もう一つ考えられる方法は、あらかじめ12個の空のセットを用意しておいて、年度で1回だけクエリーして、GOTO Selected Record()でひとつづつレコードの月度を判定してAdd to setしていく方法。集計結果はUse setしてsum()で求める。queryしてgoto selected recordしてAdd to setしてもDBからデータ転送は行われない。sum()の結果を表示するときにはじめて転送が発生する仕組みになる。この方法はコードだけ見るとモタモタしているように見えるが実行は結構速い。ただし、セレクションに対してOrder byを実行していると途端に遅くなるので注意。

集計要素が月度以外に、部門とか商品とか増えてくると、セットを使う方法は俄然有利になってくる。GOTO Selected Recordの合間にどれだけIF文による判定を増やしても処理時間はほとんど増えないからだ。もちろん用意しておくセットの数が増えるため、セットのネーミングには工夫が必要になるが、あらかじめ作る空のセットが多少増えてもそれほどオーバーヘッドにはならない。

画面に表示する情報をサーバサイドで作ってから転送する、テクニックと合わせて使うと効果は著しい。これはまた別のブログで紹介する。

高速化のポイント:クエリーを減らして1レコードずつセットに振り分けると速い