SubSonicで単一のレコードを取得する最速の方法
質問
私はSubSonicとLinq Stuffを初めて使用し、単一のレコードを取得する最短かつ最適な方法を見つけようとしています。
単一のレコードを取得するために、これよりも速く、これより少ないコードで書く必要がある他の方法はありますか?
User user2 = DB.Select().From(User.Schema)
.Where(User.PasswordColumn).IsEqualTo(password)
.And(User.SINumberColumn).IsEqualTo(siNumber)
.ExecuteSingle<User>();
AntsProfilerツールを使用して確認しましたが、これには平均29.12msのCPU時間がかかります-10回の実行でテストされました
さらに時間がかかる場所
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>();
最後の行のCPU時間は256.08msで、UserControllerは66.86msです。
提案はありますか
解決
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);
これにより、テストでの増加時間が考慮される場合があります(すべてのユーザーアイテムを要求してから、最初のアイテムを取得しています)。
他のヒント
「ボトルネック」 SubSonicが生成または結果を返すのではなく、実行される生成されたクエリになります。特定のクエリが遅い場合は、データベースプロバイダーのインデックス機能を使用して最適化することを検討する必要があります。
2番目のケースでは、LINQがコレクションから最初のアイテムを返すための追加の実行時間がオーバーヘッドであると想定しています。
だから私の答えは、最初の方法がそれを行うための最良の方法であり、29msが受け入れられない場合(DBへの呼び出しのために、私は不合理だとは思わない)、あなたのいくつかのインデックスを追加する検索を高速化するDB。
私は、ジョンが金銭的に正しいと思います。 SubSonicをテストして、どれくらいの時間がかかるかを確認したい場合は、SubSonicがSQLステートメントを作成するのにかかる時間や、DBが結果を返すのにかかる時間ではなく、SQLステートメントの作成にsubsonicがかかる時間をテストする必要があります同時に(テストを分離する必要があります)。
おそらく、通常の古いSQLCommandで結果を取得するのにかかる時間をテストし、接続とパラメーターを渡して、比較にかかる時間を確認する必要があります。