2011-09-29 3 views
3

약 250,000 개의 레코드가있는 SQL 테이블을 검색하고 2 개의 필드 만 검색하는 LINQ 쿼리가 있습니다. 두 필드 모두 색인이 생성되었지만 여전히 느리게 실행됩니다.LINQ 쿼리 속도를 높이려면?

아래 코드는 누구나 속도를 높이기 위해 어떤 제안을 할 수 있습니까?

감사

var qryN = (
    from bn in dbs.Uploads 
    orderby bn.ID descending 
    select new 
    { 

     ID = bn.ID, 
     Serial = bn.serial_no, 
     Manufacturer = bn.Mfgr, 
     Model = bn.model, 
     Code = bn.code, 
     Qty = bn.qty, 
     Description = bn.description, 
     Comments = bn.comments, 
     Location = bn.location, 
     Price = bn.price, 
     Email = "Register/Login for full details" 
    }); 

if (dlType.Text != " " && dlType.Text != "") 
{ 
    qryN = qryN.Where(bn => bn.Manufacturer == dlType.SelectedValue); 
} 

if (txtWord.Text != "") 
{ 
    qryN = qryN.Where(bn => bn.Description.Contains(txtWord.Text)); 
    } 

gvLoggedOff.DataSource = 
    from p in qryN 
    select new 
    { 
     p.ID, 
     p.Serial, 
     p.Manufacturer, 
     p.Model, p.Code, 
     p.Qty, 
     p.Description, 
     p.Comments, 
     p.Location, 
     p.Price, 
     p.Email 
    }; 

gvLoggedOff.DataBind(); var qryN = (
    from bn in dbs.Uploads 
    orderby bn.ID descending 
    select new 
    { 

     ID = bn.ID, 
     Serial = bn.serial_no, 
     Manufacturer = bn.Mfgr, 
     Model = bn.model, 
     Code = bn.code, 
     Qty = bn.qty, 
     Description = bn.description, 
     Comments = bn.comments, 
     Location = bn.location, 
     Price = bn.price, 
     Email = "Register/Login for full details" 
    }); 

if (dlType.Text != " " && dlType.Text != "") 
{ 
    qryN = qryN.Where(bn => bn.Manufacturer == dlType.SelectedValue); 
} 

if (txtWord.Text != "") 
{ 
    qryN = qryN.Where(bn => bn.Description.Contains(txtWord.Text)); 
    } 

gvLoggedOff.DataSource = 
    from p in qryN 
    select new 
    { 
     p.ID, 
     p.Serial, 
     p.Manufacturer, 
     p.Model, p.Code, 
     p.Qty, 
     p.Description, 
     p.Comments, 
     p.Location, 
     p.Price, 
     p.Email 
    }; 

gvLoggedOff.DataBind(); 
+5

생성 된 SQL을보고 프로파일 링 했습니까? –

+1

'제조업체 '에 FK가 있습니까? –

+0

Jon은 절대적으로 맞습니다. 귀하의 질문은 현재 매우 모호합니다. 우리는 LINQ to SQL, Entity Framework, Hibernate 등을 사용하는지 여부에 관계없이 데이터 모델이 어떻게 보이고, 무엇이 생성되는지 알지 못합니다. – Steven

답변

1

두 가지 :

  • 당신의 DataSource 대신 첫 번째의 마지막 줄에 (새로운 익명 형식으로 선택) 투사를 이동, 필터를 추가하고 있기 때문에 선.
  • 매우 일찍 주문하시는 중입니다. 쿼리 가능 또는 쿼리 분석기가이를 분석하고 최적화 할만큼 똑똑하지 않으면 데이터베이스는 필터링을 시작하기 전에 250,000 개의 행을 정렬해야합니다. 가능한 빨리 프로젝션을하기 전에 주문을 이동하십시오. 이 이후

    var qryN = dbs.Uploads.AsQueryable(); 
    
    if (dlType.Text != " " && dlType.Text != "") 
        qryN = qryN.Where(bn => bn.Mfgr == dlType.SelectedValue); 
    
    if (txtWord.Text != "") 
        qryN = qryN.Where(bn => bn.description.Contains(txtWord.Text)); 
    
    gvLoggedOff.DataSource = qryN.OrderByDescending(bn => bn.ID) 
        .Select(bn => new { 
         bn.ID, Serial = bn.serial_no, Manufacturer = bn.Mfgr, 
         Model = bn.model, Code = bn.code, Qty = bn.qty, 
         Description = bn.description, Comments = bn.comments, 
         Location = bn.location, Price = bn.price, 
         Email = "Register/Login for full details" }); 
    
    gvLoggedOff.DataBind(); 
    

    는 대답으로 받아 들여졌다 :

여기에 샘플을 수정에서 짧은 시도의 텍스트 검색에 대한 Steven's answer도 아마 어떤 상황에 적용 할 수 있습니다. 전체 텍스트 검색은 믿을 수 없을 정도로 성능을 떨어 뜨릴 수 있습니다.

qryN = qryN.Where(bn => bn.Description.Contains(txtWord.Text)); 

Contains 통화는 SQL description LIKE '%' + @p0 + '%'로 변환 :

+0

그래, 나는 클라이언트가 원했던 것을 깨닫습니다. 나는 당신의 솔루션을 사용했고 스티븐스를 한 필드에 넣었고 그 결과는 훌륭했습니다. 다시 한 번 감사드립니다. – DarkW1nter

+0

@ 페드로 : 오, 물론 "나는하지 말라"고 말하는 것이 아닙니다. 그것". – Jesper

+0

하나의 작은 추가 :'if (dlType.Text! = ""&& dlType.Text! = "")'는 if (! string.IsNullOrWhiteSpace (dlType.Text))가 될 수 있습니다. –

7

Description의 필터는 문제가 될 수 있습니다. 즉, description 열에 인덱스가 있어도 SQL Server는 전체 인덱스 (또는 전체 테이블)를 반복해야합니다. 가능하면, 다음에 줄을 변경 :이 효율적으로 인덱스를 사용하도록 데이터베이스 서버를 수 description LIKE @p0 + '%'로 변환합니다

qryN = qryN.Where(bn => bn.Description.StartsWith(txtWord.Text)); 

.

1

Description.Contains 소리가 심할 경우 전체 텍스트 검색을 대신 사용해보십시오.

Here은 LINQ에서 FTS를 사용하는 방법을 설명하는 게시물입니다.

관련 문제