簡體   English   中英

需要EF生成的查詢性能調整。 還是數據庫問題?

[英]EF generated query performance tuning required. Or a database issue?

我有一個由EF 6生成的搜索查詢, 有時會導致搜索條件出現性能問題,從而產生較大的結果。 查詢性能是不可預測的,有時性能不錯,有時卻不好。以下是sql profiler中捕獲的查詢,該查詢查詢一個視圖

exec sp_executesql N'SELECT 
[Extent1].[LastName] AS [LastName], 
[Extent1].[FirstName] AS [FirstName],
.
. 
FROM (SELECT 
[PersonView].[LastName] AS [LastName], 
[PersonView].[FirstName] AS [FirstName],
.
.
FROM [Staff].[PersonView] AS [PersonView]) AS [Extent1]
WHERE [Extent1].[FirstName] = @p__linq__0',N'@p__linq__0  varchar(8000)',@p__linq__0='smith'

以下是存儲庫代碼

public IEnumerable<PersonSearchResult> SearchPersons(Expression<Func<PersonView, bool>> searchCriteria)
{
    var query = _entities.PersonViews.AsExpandable().Where(searchCriteria);
    return query;
}

我正在使用謂詞構建器來創建動態搜索條件。

我擔心的是在相同搜索條件下性能的不可預測性。

以下是我的問題

  1. 我相信從表查詢格式選擇x中選擇x會導致此問題。 當我只執行Select的內部部分時,當整個查詢陷入困境時,它的性能會更好。 這需要調整嗎? 如果是,從哪里開始?

  2. 還是這是數據庫的問題? 因為此查詢有時表現良好?

  1. 沒有。
  2. 根據WHERE部分中的實際條件集,SQL Server可能會使用索引,這將導致更好的性能(假設有任何條件)。 通過非索引列進行的篩選速度很慢且占用資源,但最糟糕的是-不可預測的速度很慢,即今天可以忍受,明天就停滯不前。

通常,帶有冗長文本(例如人的名字)的列很少被索引,因此您的特定示例注定要表現不佳。 當然,除非按名/姓搜索是系統功能的關鍵部分,否則您將為搜索條件中可能提到的所有列創建索引,包括與這些列一樣大的索引。

我建議搜索顯示“建議索引”的SQL腳本,應該很方便。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM