2012-08-07 2 views
1

실행하는 데 약 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#을 사용하고 있습니다.

+0

모든 필터 입력란에 인덱스를 DB에 추가 했습니까? –

+0

@JustinHarvey 내 열은 nvarchar (max) 유형입니다. 색인을 추가 할 수 없습니다. 인덱스의 키 열에 대해 형식이 유효하지 않다는 메시지가 나타납니다. –

+0

@Wouter, FirstName, MiddleName, LastName 등의 경우 왜 'nvarchar (max)'가 필요한지 알 수 없습니다. 이름은 얼마나 오래있을 수 있습니까? (최대) – Kashif

답변

0

이 검색어에 대해 SQL 쿼리/Linq 쿼리를 사용하지 않습니다. 텍스트 검색을위한 일반적인 쿼리는 느릴 수 있으며 정확한 결과 만 반환합니다. 맞춤법/문법 오류 등을 수정하지 않습니다.

SQL Server의 '전체 텍스트 검색'기능을 사용하는 것이 좋습니다. 그 결과 성능은 여전히 ​​좋지 않을 수 있습니다. http://www.sql-server-performance.com/2010/full-text-search-2008/을 참조하십시오.

Apache Lucene (Lucene.NET에서 dll로 사용 가능)과 같은 검색 인덱서를 사용하는 것이 좋습니다. 또 다른 옵션은 모든 레코드를 인덱싱하는 고유 한 Windows 서비스를 작성하는 것입니다.

관련 문제