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

データアクセスの最適化

さっそく最適化していきましょう。まずは、探索を親テーブルから子テーブルに限定しても今回のシナリオでは問題ないので、以下のように検索ポリシーを少し変えて実行します。もちろんドメインモデルは全く影響しません。

da.Fill(model, qo, FillPolicy.ChildRelation); 

結果は6回減ってSelect文が15回になりました。

Select [商品ID],[商品名],[タイプ],[単体価格],[サイズ] From [商品] Where ....
Select [グループ商品ID],[アイテム商品ID] From [グループ商品構造] Where  ....
Select [商品ID],[構成商品ID],[アイテム名],[追加価格],[単体商品_構成商品 ....
Select [商品ID],[商品名],[タイプ],[単体価格],[サイズ] From [商品] Where ....
Select [グループ商品ID],[アイテム商品ID] From [グループ商品構造] Where  ....
Select [商品ID],[商品名],[タイプ],[単体価格],[サイズ] From [商品] Where ....
Select [グループ商品ID],[アイテム商品ID] From [グループ商品構造] Where  ....
Select [商品ID],[構成商品ID],[アイテム名],[追加価格],[単体商品_構成商品 ....
Select [商品ID],[構成商品ID],[アイテム名],[追加価格],[単体商品_構成商品 ....
Select [商品ID],[商品名],[タイプ],[単体価格],[サイズ] From [商品] Where ....
Select [グループ商品ID],[アイテム商品ID] From [グループ商品構造] Where  ....
Select [商品ID],[商品名],[タイプ],[単体価格],[サイズ] From [商品] Where ....
Select [グループ商品ID],[アイテム商品ID] From [グループ商品構造] Where  ....
Select [商品ID],[構成商品ID],[アイテム名],[追加価格],[単体商品_構成商品 ....
Select [商品ID],[構成商品ID],[アイテム名],[追加価格],[単体商品_構成商品 ....

更に、関連テーブルの検索処理を最適化していきましょう。今回のORMでは検索する関連データを事前に絞り込むことができるようにしています。この機能を利用して、単体商品_構成商品のテーブルの検索は単体タイプの商品のみに限定して検索するように処理を追加します。グループ商品構造の検索も同様に事前に絞りこみます。

void da_商品TableSelecting(object sender, TableSelectingEventArg e)
{
	if (e.RelationPath == null) return;

	if (e.RelationPath.RelationName == "商品_単体商品_構成商品_FK2")
	{
		DataView dv = new DataView(e.SourceTable, 
		  "タイプ='単体'", "", DataViewRowState.CurrentRows);
		e.QueryTable = dv.ToTable();
	}

	if (e.RelationPath.RelationName == "商品_グループ商品構造_FK2")
	{
		DataView dv = new DataView(e.SourceTable, 
		  "タイプ='グループ'", "", DataViewRowState.CurrentRows);
		e.QueryTable = dv.ToTable();
	}
}

この結果、Select文の実行が10回に減りました。最初の半分程度になりました。

Select [商品ID],[商品名],[タイプ],[単体価格],[サイズ] From [商品] Where ....
Select [商品ID],[構成商品ID],[アイテム名],[追加価格],[単体商品_構成商品 ....
Select [商品ID],[商品名],[タイプ],[単体価格],[サイズ] From [商品] Where ....
Select [グループ商品ID],[アイテム商品ID] From [グループ商品構造] Where  ....
Select [商品ID],[商品名],[タイプ],[単体価格],[サイズ] From [商品] Where ....
Select [商品ID],[構成商品ID],[アイテム名],[追加価格],[単体商品_構成商品 ....
Select [商品ID],[構成商品ID],[アイテム名],[追加価格],[単体商品_構成商品 ....
Select [商品ID],[商品名],[タイプ],[単体価格],[サイズ] From [商品] Where ....
Select [グループ商品ID],[アイテム商品ID] From [グループ商品構造] Where  ....
Select [商品ID],[商品名],[タイプ],[単体価格],[サイズ] From [商品] Where  ....

少しSelect文の数が多いように感じるかもしれませんが、セット商品+グループ構造の2つの階層構造を持っていることを考えると悪くないように考えています。