Fract's Blog
Tips

EFCoreの初回クエリが遅かった

EFCoreの初回クエリが遅かった体験と解決方法した方法について。

WPF+EFCoreの環境でログインの実行がなんか遅かったので計測してみると、 ログインボタンを押してから次の画面に行くのが約1.5秒も掛かっていました。 ログインは頻繁に行うので1秒以上かかると意外とストレスです。 計測していくと打ち込まれたユーザーを取得するクエリが1.3秒ほど掛かっていました。 他の画面ではそういったことはないためすぐに初回のクエリだからかなとあたりを付けて 調べていると、GitHubとスタックオーバーフローにも同様の投稿がみられました。

https://github.com/dotnet/efcore/issues/27392

解決方法は事前にダミーのクエリを実行しておくことでした。 私はApp.xaml.csのスタートアップ時に

// App.xaml.cs
protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);
    _ = InitDBContextAsync();
    // その他の処理
}

async Task InitDBContextAsync()
{
    using var ctx = await DBContext.xxxAsync();
    // サーバータイムなどの適当なセレクト
}

を実行するようにしました。 バックグラウンドで実行しUIスレッドを占有しないようにしています。 これはパスワードなどを入力しているうちに初回クエリが実行されてDBコンテキストの初期化が終了しているという算段です。 これにより約1秒ほどの高速化ができました。 意外とWebなどでは他の処理もあり初回実行時の遅さに気づきませんでした。 今回はAIに頼らないで即解決できてよかった〜です!