2009-05-03 14 views
0

私はSubSonicとLinq Stuffを初めて使用しており、単一のレコードを取得する最短かつ最適な方法を見つけようとしています。SubSonicで単一のレコードを取得する最速の方法

これ以外の方法では、単一のレコードを取得するには、これより速く、書き込みするコードが少なくて済みますか?これはさらに長い

UserController uc = new UserController(); 
Query query = new Query("User"); 
query.WHERE(User.Columns.Password, password); 
query.WHERE(User.Columns.SINumber, siNumber); 
User user = uc.FetchByQuery(query).First<User>(); 

ただ、最後を取るよう10の実行

にわたって試験 - 私がチェックしAntsProfilerツールに使用している、これは29.12msのCPU時間のavgを要する

User user2 = DB.Select().From(User.Schema) 
.Where(User.PasswordColumn).IsEqualTo(password) 
.And(User.SINumberColumn).IsEqualTo(siNumber) 
.ExecuteSingle<User>(); 

256.08msのCPU時間とUserControllerの消費時間は66.86msです。

提案がありますか?

答えて

1

IIRC、Queryオブジェクトが堪能..ですつまり

query.WHERE(User.Columns.Password, password); 
query.WHERE(User.Columns.SINumber, siNumber); 

として次のようになります。

query = query.WHERE(User.Columns.Password, password); 
query = query.WHERE(User.Columns.SINumber, siNumber); 

をあなたのテストで増加した時間がこれのために計上することができる(あなたが求めていますすべてのユーザーアイテムについて、そして最初のものをつかむ)。

3

"ボトルネック"は、生成されたクエリの実行であり、SubSonicがそれを生成したり結果を返すのではありません。特定のクエリが遅い場合は、データベースプロバイダのインデックス関数を使用してインデックスを最適化する必要があります。

2番目のケースでは、LINQがコレクションの最初のアイテムを返すための追加の実行時間がオーバーヘッドであると仮定しています。

私の答えは、最初の方法はそれを行うための最善の方法であり、29msが許容できない場合(DBへの呼び出しの場合、私は不合理だとは思わない)、あなたのDBは検索をスピードアップします。

0

ジョンはお金の上にいると思います。実際にSubSonicをテストしてどのくらいの時間がかかるかを見たい場合は、亜音速でSQL文を作成するのにかかる時間をテストする必要があります.SSSonicを作成するには時間がかかりません。また、DBが結果を返すまでにかかる時間同時に(あなたはテストを分離する必要があります)。

おそらく、通常の古いSQLCommandで結果を取得し、接続とパラメータを渡して比較に要する時間を確認するのにかかる時間をテストする必要があります。

関連する問題