1

У меня есть поисковый запрос, сгенерированный EF 6, который иногда вызывает проблемы с производительностью для критериев поиска, что дает большие результаты. Производительность запросов непредсказуем, иногда он выполняет хорошо, и иногда его not.The следующее запрос пойманы в SQL Profiler, который запрашивает видТребуется настройка производительности запросов EF. Или проблема с базой данных?

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' 

Ниже приведен код Repository

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

I» m с помощью построителя предикатов для создания динамических критериев поиска.

Моя озабоченность связана с непредсказуемым характером исполнения с теми же критериями поиска.

Ниже приведены мои вопросы

  1. Я считаю, что выбрать х из отборного х из формата таблицы запроса является причиной этой проблемы. Когда я выполнял только внутреннюю часть «Выбор», он работал лучше, когда весь запрос боролся. Нужно ли это настраивать? Если да, с чего начать?

  2. Или это проблема с базой данных? Потому что этот запрос иногда работает хорошо?

+0

Вы должны убедиться, что проблемы с производительностью связаны с фильтрами по конкретным столбцам. Вам нужно сделать больше анализа. –

+0

Запустите запрос в SSMS, проверьте план выполнения, там могут быть предложены индексы. – artm

ответ

0
  1. No.
  2. В зависимости от фактического набора условий в WHERE части, SQL Server может использовать индексы, что приведет к более высокой производительности (при условии, есть). Фильтрация неиндексированными столбцами медленная и ресурсоемкая, но хуже всего - она ​​непредсказуемо медленна, то есть переносится сегодня и задерживается завтра.

Обычно столбцы с длинным текстом, такие как имена людей, редко индексируются, поэтому вашему конкретному примеру суждено выполнить плохо. Если, конечно, поиск по именам/фамилиям не является важной частью функциональности вашей системы, и вы создадите индексы для всех столбцов, которые могут быть указаны в критериях поиска, в том числе и таких, как эти.

Я бы рекомендовал искать SQL-скрипты, которые показывают «предлагаемые индексы», должны быть удобными.

Смежные вопросы