0

SubSonic と Linq スタッフは初めてで、単一のレコードを取得する最短かつ最適な方法を見つけようとしています。

単一のレコードを取得するために、これよりも速く、より少ないコードで記述できる方法は他にあるでしょうか?

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

AntsProfiler ツールを使用してチェックしましたが、これには平均 29.12 ミリ秒の 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>();

最後の行だけで 256.08ms の CPU 時間がかかり、さらに UserController は 66.86ms かかります。

助言がありますか?

4

3 に答える 3

2

「ボトルネック」は、SubSonic が生成したり結果を返したりするのではなく、生成されたクエリの実行です。特定のクエリが遅い場合は、データベース プロバイダーのインデックス作成機能を使用して最適化することを検討する必要があります。

2 番目のケースでは、LINQ がコレクションから最初の項目を返すために追加の実行時間がオーバーヘッドになると想定しています。

だから私の答えは、最初の方法がそれを行うための最良の方法であり、29ミリ秒が受け入れられない場合(DBへの呼び出しの場合、これは不合理だとは思いません)、速度を上げるためにDBにいくつかのインデックスを追加しますアップリトリーブ。

于 2009-05-04T03:43:48.723 に答える
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);

テストでの増加した時間は、これが原因である可能性があります (すべての User アイテムを要求してから、First を取得しています)。

于 2009-05-04T14:04:27.937 に答える
0

私は、ジョンはお金の面で正しいと思います。SubSonic を実際にテストして、SQL ステートメントを作成するのにかかる時間をテストする必要がある場合は、SubSonic が SQL ステートメントを作成するのにかかる時間と、DB が結果を返すのにかかる時間ではなく、SQL ステートメントを作成するのにかかる時間をテストする必要があります。同時に(テストを分離する必要があります)。

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

于 2009-05-04T13:50:47.937 に答える