ユーザー統計テーブルから最後の50レコードを取得する必要があります(テーブルには100万を超えるレコードがあります)。以下のクエリを実行すると、応答が非常に遅くなり、IIS7プールのメモリ使用量が最大800MBに跳ね上がります。クエリはアプリケーション自体ではなくSQLServerで実行されると思いました。このクエリを最適化する方法は?
user.Statistics.OrderByDescending(p => p.DateStamp).Take(50);
ユーザー統計テーブルから最後の50レコードを取得する必要があります(テーブルには100万を超えるレコードがあります)。以下のクエリを実行すると、応答が非常に遅くなり、IIS7プールのメモリ使用量が最大800MBに跳ね上がります。クエリはアプリケーション自体ではなくSQLServerで実行されると思いました。このクエリを最適化する方法は?
user.Statistics.OrderByDescending(p => p.DateStamp).Take(50);
このクエリはサーバー上で実行されます。DateStamp列に適切なインデックスがないため、クエリが遅いと思います。
LinqPadのコピーを取得し(まだコピーがない場合)、LinqPadでこのクエリを実行し、サーバーに送信されているT-SQL(LinqPadで許可されている)を確認し、 T-SQLを使用して、SSMSのクエリ実行プランを確認します。インデックスシークの代わりに、テーブルスキャンが実行されているに違いありません。
適切なインデックスを設定すると、テーブルに1,000万行ある場合でも、このクエリは最大で1〜2秒で実行されます。