2013-03-29 3 views
-1

, 데이터 세트에 내가 LINQ 쿼리를 다음 있습니다 :Linq는 쿼리 최적화

var itembind = (from q in dsSerach.Tables[0].AsEnumerable() 
      select new 
          { 
           PatternID = q.Field<int>("PatternID"), 
           PatternName = q.Field<string>("PatternName") + " " + q.Field<string>("ColorID") + q.Field<string>("BookID"), 
           ColorID = q.Field<string>("ColorID"), 
           BookID = q.Field<string>("BookID"), 
           CoverImage = (from img1 in objJFEntities.ProductImages.ToList() 
              where img1.PatternName.ToLower() == q.Field<string>("PatternName").ToLower() 
              select new CoverImage 
              { 
               URL = "Images/MediumPatternImages/" + 
                q.Field<string>("PatternName") + "_" + q.Field<string>("ColorID") + q.Field<string>("BookID") + q.Field<string>("ImageExtension"), 
               ID = q.Field<int>("ProductImageID") 
              }).FirstOrDefault(), 
           TotalCount = q.Field<int>("TotalCount") 
          }).Distinct(); 



var patterns = (from r in itembind 
      group r by new { r.PatternID, r.ColorID } into g 
      select new SearchPattern 
      { 
       PatternID = g.Key.PatternID, 
       PatternName = string.Join(",", g.OrderBy(s => s.ColorID).OrderBy(s => s.BookID) 
              .Select(s => String.Format("<a href='{0:s}' title='{1:s}'>{2:s}</a><br />", 
                new object[] { String.Format("Product.aspx?ID={0}&img={1}", g.Key.PatternID, s.CoverImage.ID), s.PatternName, s.PatternName })).FirstOrDefault()), 
       CoverImage = g.Count() > 1 ? (from img1 in objJFEntities.ProductImages.ToList() 
               where img1.ProductImageID == g.Select(i => i.CoverImage.ID).FirstOrDefault() && img1.ColorID.ToString() == g.Key.ColorID 

               select new CoverImage 
               { 
                URL = "Images/MediumPatternImages/" + 
                 img1.PatternName + "_" + img1.ColorID + img1.BookID + img1.ImageExtension, 
                ID = img1.ProductImageID 
               }).FirstOrDefault() : g.Select(i => i.CoverImage).FirstOrDefault() 


      }).ToList(); 

이러한 쿼리 만 1000 개 레코드를 실행하기 위해 더 많은 다음 1 분하고있다. dsSearch는 내 프로 시저에서 SQL로 반환 된 레코드로 채워진 데이터 집합입니다. 엔티티 프레임 워크를 사용하고 있습니다. 이 사이트는 IIS7.0과 함께 배포됩니다. SQL Server 2008이 사용 중입니다.

나는 " 오류 메시지. : 제한 시간이 만료 제한 시간은 작업의 완료 또는 서버가 응답하지 전에 경과을."가지고 로그인에서 "없습니다 데이터베이스를 열 수 없습니다"DB "를 요청, 가 로그인에 실패했습니다. . " & "기본 제공 업체가 Open에서 실패했습니다." 오류의 종류는 매우 자주 사이트.

이러한 쿼리를 최적화하는 방법을 알려주십시오.

는 편집 : 여기

이 인출되는 첫 번째 쿼리는합니다 (ToList과 더불어, objJFEntities.ProductImages.ToList을()하고있는) 전화에서 절차

http://pastie.org/7160934

+0

연결 문자열이 정확한지 확인 했습니까? 통합 보안을 사용하고 있습니까? –

+0

예, 확인했습니다. 연결 문자열에 통합 보안을 사용하지 않습니다. – Neha

+0

오류는 데이터베이스 연결이 시간 초과가 아니라 쿼리가 아니라는 것을 의미합니다 (기본 시간 초과는 60 초라고 생각합니다). 연결 및 IIS 설정을 확인합니다. –

답변

2

Rolfvm은 objJFEntities.ProductImages이 문제의 원인이라는 점을 지적했지만 분석은 약간 다릅니다. 전체 ProductImages 테이블을 메모리에 개를 가져 와서 열거 할 때 각 쿼리의 반복을 가져옵니다. 그래서 하나의 최적화 컬렉션의 첫 번째 이미지를 가져 오는 쿼리 문

var localImages = objJFEntities.ProductImages.ToList(); 
... 
CoverImage = (from img1 in localImages.... 

그러나 다음에 해당 모음을 사용하는 것입니다, 당신의 쿼리가 너무 많이 할 것 같다. 첫 번째 부분은 실행하지 않고 itembind을 빌드합니다. 그런 다음 두 번째 부분 (var patterns = (from r in itembind)을 만들고 ToList()으로 실행합니다. 그러나 두 번째 부분에서는 CoverImage을 사용하지 않습니다. 따라서 이들을 만드는 것은 자원 낭비입니다. (또는 코드를 건너 뛰고 첫 번째 부분을 다른 용도로 사용하지 마십시오.)

+0

감사합니다. 컬렉션을 별도의 작품으로 푸시하고 이제는 이전 시간의 1/4이 걸립니다. 차이점을 이해합니다. 많은 감사드립니다. 한 번 내 프로 시저를 너무 확인하고 나에게도 제안을 줄 수 있다면 최적화 할 수 있습니다. – Neha

+0

글쎄, 내가 말했듯이 왜 CoverImage 객체를 생성하는지 궁금하다. 그리고 여러분이 필요로하는'ProductImages' 만 가져올 수도 있습니다. –

+0

coverImage는 패턴 쿼리 및 내 UI의 결과에 사용됩니다. – Neha

3

입니다 데이터베이스의 모든 항목을 저장하고 나중에 메모리에 결과를 필터링합니다.

+0

ToList()를 제거한 후 시도했습니다. 그 후에 쿼리는 어떤 출력도 제공하지 않습니다. – Neha

+0

하지만 쿼리의 성능이 훨씬 더 좋았을 것입니다.). – Rolfvm

+0

그러나 ToLower() 작업은 SQL에 매핑하여 지원되지 않을 수 있습니다 (사용중인 데이터베이스가 확실하지 않은 경우). 따라서 사용중인 데이터베이스 collaction에 따라 다릅니다. 쿼리가 결과를 반환하지 않는 이유를 확인하는 가장 좋은 방법은 SQL 관리 스튜디오 – Rolfvm