簡易ORMフレームワークを作成してみる(18)

さらなる最適化

トランザクションスクリプト派やリッチSQL派の方からすれば、もっと最適化できると指摘されるかもしれません。たとえば、JOINを利用した最適化が考えられます。しかし、JOINによりSelect文の実行回数を減らしても、逆にJOINによって1つのSelect処理が重くなる可能性もあり、それほどパフォーマンスが良くならないと思っています。もし、SQL文の達人の方で、いやいやもっと簡単で速い方法があるというのであれば、教えてもらえるとありがたいです。


実は今回のシナリオではもっと有効な最適化方法があります。それは、以下のように全データを読み出すようにしてしまえば、単純なSQL文の実行3回になってしまいます。データベースからの読み出しデータ量が多くなるデメリットはありますが、データ量が大幅に増えなければ十分利用できます。ハンバーガショップの品目点数を考えばぜんぜん問題ないはずです。さらに全データの読み出しなのでキャッシュ化も簡単にできるメリットもあります。

da.Fill(model, qo, FillPolicy.ChildRelation|FillPolicy.AllData); 
Select [商品ID],[商品名],[タイプ],[単体価格],[サイズ] From [商品]
Select [グループ商品ID],[アイテム商品ID] From [グループ商品構造]
Select [商品ID],[構成商品ID],[アイテム名],[追加価格],[単体商品_構成商品ID] 
From [単体商品_構成商品]

このような最適化は別に特別な事ではなく、一般的なLOBアプリでもサイズの小さいマスタをメモリで保持するテクニックは適用できます。データの変更特性や量を考えて最適化することは小手先のSQL文の最適化よりもはるかに効果がある場合も多いです。ドメインモデルはこの最適化を非常に簡単にできるのです。