실행하는 데 약 6 초가 걸리는 쿼리를 최적화하려고합니다.여러 포함 문을 사용하여 Entity Framework 쿼리를 최적화하십시오.
string[] filters = ...;
var data =
(from n in ctx.People
.Where(np => np.IsActive)
let isFilterMatch = filters.All(f => n.FirstName.ToLower().Contains(f) ||
n.Prefix.ToLower().Contains(f) ||
n.MiddleName.ToLower().Contains(f) ||
n.LastName.ToLower().Contains(f) ||
n.Information.Email.ToLower().Contains(f) ||
(n.Address!= null &&
(SqlFunctions.StringConvert((double)n.Address.Number).
Contains(f) ||
n.Address.Street.ToLower().Contains(f) ||
n.Address.ZipCode.ToLower().Contains(f) ||
n.Address.City.ToLower().Contains(f))))
where isFilterMatch
orderby n.LastName
select n
).Take(numberOfItems).ToList();
검색 대화 상자에 대한 쿼리입니다. 사용자는 텍스트를 입력 할 수 있으며 입력과 일치하는 사람을 검색합니다. 우리는 사용자 입력을 문자열 배열로 분할 한 다음 Person 필드에 Contains를 수행합니다. 필터 배열로 인해 쿼리를 미리 컴파일 할 수 없습니다.
어떻게이 기능을 최적화 할 수 있습니까? SQL Server 또는 저장 프로 시저에 대한 FullTextSearch와 같은 것에 대해 들었습니다. 도움이 될까요?
우리는 SQL Server 2008, Entity Framework 4.0 (모델 우선) 및 C#을 사용하고 있습니다.
모든 필터 입력란에 인덱스를 DB에 추가 했습니까? –
@JustinHarvey 내 열은 nvarchar (max) 유형입니다. 색인을 추가 할 수 없습니다. 인덱스의 키 열에 대해 형식이 유효하지 않다는 메시지가 나타납니다. –
@Wouter, FirstName, MiddleName, LastName 등의 경우 왜 'nvarchar (max)'가 필요한지 알 수 없습니다. 이름은 얼마나 오래있을 수 있습니까? (최대) – Kashif