本番環境でサービスとして実行されるアプリがありますが、単純な GUI を使用して手動でテストを行っています。実際には何も行われておらず、入力用のテキスト ボックスを備えた単なるラッパーです。
最近、データベース スキーマを変更し、マッピングを一致するように更新したところ、些細なケースで GUI の動作が突然非常に遅くなりました。ログを記録して何度も実行した後、新しいボトルネックは次のクエリであることが判明しました。
public void Refresh()
{
using (var session = _sessionFactory.OpenSession())
{
_allFields = session.Query<FieldDefinition>().ToList();
}
}
繰り返しますが、その 1 つのメソッドに 1:08 分かかりました (データベースには約 300 の FieldDefinitions しかありませんが)。この時点で、GUI を手動で再実行するのにうんざりしていたので、まったく同じケースを実行する単体テストを作成しましたが、スローダウンを再現できませんでした。
私のテストでは、GUI が同じ入力で行うのと同じトップレベル オブジェクトを呼び出しました。これはほぼ同じ時間で実行されると予想されます。しかし、MSTest を使用して Visual Studio で実行すると、同じクエリにかかる時間は 2 秒未満でした。30分の1の時間です。まったく同じ作業を行っていましたが、大幅に高速でした。
それらを同じように実行できるかどうかを確認するためにチェックしたこと:
- どちらの方法でも、同じ数の SQL ステートメントが生成されました。
- JITterが原因ではないようです(GUIを再起動せずに複数回実行すると、同じ時間が何度も発生します)
ISessionFactory
それぞれに新品を使用するように分離しRefresh
ても効果はありませんでした- ロギング (log4net) をオフにしても効果はありませんでした
子をeager-loadするようにクエリを変更するとうまくいきました...種類:修正を適用した後、WinFormsアプリは単体テストがすでに行われたのと同じくらい高速です。単体テストの速度は大幅に変わりませんでした (10 分の 1 秒)。
古いクエリがselect n+1
問題を引き起こしていましたが、この問題は Winform と MSTest の両方の実行に存在していました。そのため、WinForm アプリだけが大幅な速度低下を経験しました。
これをどのように説明できますか?Select N+1 クエリ中に WinForm アプリだけが大幅にスローダウンするのはなぜですか?