0

私はデータベースからデータを取り出して検索するこの機能を持っています。問題は、Entityフレームワークで検索すると遅いですが、同じクエリを使用するとログから取得してSSMSで使用するのが速いことです。私はまた映画の割り当てがあると言う必要があります、388262。私はまた、映画のタイトルのインデックスを追加しようとしましたが、助けていませんでした。私はSSMSで使用検索は速く、検索は遅くSSMSの検索が高速です。

問合せ:

public IActionResult Index(MovieIndexViewModel vm) { 
    IQueryable<Movie> query = _movieRepository.GetAll().AsNoTracking(); 

    if (!string.IsNullOrWhiteSpace(vm.Search)) { 
     query = query.Where(m => m.title.ToLower().Contains(vm.Search.ToLower())); 
    } 

    vm.TotalItemCount = query.Count(); 
    vm.Movies = query.Skip(_pageSize * (vm.Page - 1)).Take(_pageSize); 
    vm.PageSize = _pageSize; 

    return View(vm); 
} 
+0

.AsNoTracking()を追加しても高速化されません。 –

+0

'vm.TotalItemCount = query.Count();を削除すると高速ですが、見つかった結果の数が必要です。これをLINQでどうやって行うのですか? –

+0

ssmsでは、ツールに行くとプロファイラがありますか?可能であれば、トレースをスピンアップして、生成されたSQLをポストすることができます。また、あなたが遅いと言うときはどのくらい遅いことを意味します。 2回目と同じくらい遅いですか? –

答えて

0

警告:私はと多くの経験を持っていない

SELECT * 
FROM Movie 
WHERE title LIKE '%pirate%' 
ORDER BY @@ROWCOUNT 
OFFSET 0 ROWS FETCH NEXT 30 ROWS ONLY 

エンティティコード(_movieRepository.GetAllは()照会可能で、すべての映画ではない返されます) Entityフレームワークあなたがいるだけで、特定の列を選択する

  • しかし、あなたはあなたがすることにより、クエリのパフォーマンスを向上することができるかもしれません投稿した内容を見てみるとEntity Framework Performance Article from Simple talk.で利用できる便利なデバッグのヒントを見つけるかもしれません興味があります(あなたは「タイトル」列を検索することに興味があるようです)。

  • データタイプには特に注意してください。あなたはVARCHAR(40)(またはいくつかの適切な文字の制限)にごNVARCHAR変数を変換したい場合があります

0

試しTOLOWER()もののすべてを削除し、

if (!string.IsNullOrWhiteSpace(vm.Search)) { 
     query = query.Where(m => m.title.Contains(vm.Search))); 
    } 

のSQL Server(C#のとは違って)デフォルトでは大文字と小文字は区別されません(ただし、そのように設定することはできます)。あなたのクエリは、テーブルのすべてのレコードを小文字にSQL Serverを強制し、比較を行います。

+0

私はこれを試しましたが、速度は変わりませんでした。 –