2016-05-22 212 views
0

我有這個功能,它從數據庫中獲取數據並且還具有搜索功能。問題是,當我使用實體框架進行搜索時,速度很慢,但如果我使用與日誌相同的查詢並在SSMS中使用它,則速度很快。我還必須說有一些電影,388262.我也嘗試在電影中添加一個標題索引,但沒有幫助。快速查詢不搜索,搜索速度慢,但在SSMS中快速搜索

查詢我在SSMS使用:

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

實體代碼(_movieRepository.GetAll()返回可查詢不是所有電影):

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。同樣,當你說緩慢有多慢你的意思。第二次是慢嗎? –

回答

0

警告:我沒有用太多的經驗實體框架。

然而,你可能會發現在Entity Framework Performance Article from Simple talk.提供有用的調試技巧看着你已經發布你也許能改善你的查詢性能:

  • 只選擇你的具體列感興趣(這聽起來像你只是在查詢'標題'欄目)。

  • 請特別注意您的數據類型。你可能會想你的NVARCHAR變量轉換爲VARCHAR(40)(或相應的字符限制)

0

嘗試刪除所有的ToLower將()的東西,

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

SQL服務器(不像C#)在默認情況下不區分大小寫(儘管您可以將其配置爲這種方式)。您的查詢迫使sql服務器將表中的每條記錄小寫,然後進行比較。

+0

我試過這個,但它沒有改變速度。 –