2012-07-31 3 views
0

엔티티 프레임 워크에서 외래 키인 열로 그룹화하는 두 개의 매우 간단한 쿼리가 있습니다. 즉 테이블 필드는 다음과 같습니다엔티티 프레임 워크 최적화 쿼리 - 시간 초과 만료

pk : Primary key 
name : name of object 
f1: foreign key1 
f2: foreign key2 
... 

나는 점점 오전 시간 제한 예외는, 특히이 하나

Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. 
    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) 

쿼리는 다음과 같습니다

var q = from x in db.Table select x; 
var query_1 = q.GroupBy (record => record.f1); 
var query2 = q.GroupBy(record => new {record.f1, record.f2}); 

나는 약 30,000 레코드를 DB와 나는 왜 단순한 그룹이 시간 초과되는지 이해할 수 없다. 내가 뭘해야한다고 제안 했니? Entity Framework 4.1을 사용하고 있으므로 DB 엔진 자체에서 아무 것도 변경하지 않는 솔루션을 원하므로 구현에서 데이터베이스를 추상화하려고합니다. f1 또는 f2 (또는 둘 모두) 필드의 색인을 생성하면 더 빠른 쿼리를 얻을 수 있습니까? 그렇다면 Enfity Framework에서 인덱싱의 개념과 방법을 설명해주십시오. 타임 아웃을 늘리는 것이 해결해야 할 유일한 해결책이 아니라고 생각합니다. 문제가 더 많은 데이터로 남아있게 될까봐 걱정됩니다.

편집 : 나는 EF 마이그레이션에 대한 here을 언급 한 것을 노력했다.

그러나
namespace DataAccessLayer.Migrations 
{ 
    using System; 
    using System.Data.Entity.Migrations; 

    public partial class IX_Table1_fId : DbMigration 
    { 
     public override void Up() 
     { 
      Console.WriteLine("Creating Index"); 
      CreateIndex("Table1", "fId"); 
      Console.WriteLine("Index Created"); 
     } 

     public override void Down() 
     { 
      DropIndex("Table1", "IX_Table1_fId"); 
     } 
    } 
} 

,이 코드가 호출되는 않습니다

나는 결과로이 클래스를 가지고? 콘솔에있는 인쇄 문이 보이지 않습니다.

+0

'Up'과'Down' 메쏘드는 응용 프로그램 시작시 (디폴트 DB 이니셜 라이저가있는 경우) 또는 패키지 관리자 콘솔에 명시 적으로'update-database'를 입력 할 때 자동으로 호출됩니다. 후자의 경우 콘솔 출력이 블랙홀로 사라집니다. –

답변

1

먼저해야 할 일은 성능 문제가 어디에 있는지 확인하는 것입니다. SQL Server 프로파일 러 인스턴스를 시작한 다음 쿼리를 수행하는 코드를 실행합니다. 실제 SQL 쿼리 실행을 캡처하고 소요 시간을 확인하십시오.

시간이 걸리는 SQL 실행 인 경우이를 분석하는 가장 쉬운 방법은 SQL Server Management Studio에 붙여넣고 거기에서 실행하고 쿼리 계획을 확인하는 것입니다. 추가 할 색인을 제안합니다.

쿼리 자체가 빠르면 결과의 EF 처리가 문제가됩니다 (이 경우에는 의심 스럽습니다).

데이터베이스에 인덱스를 적용하는 방법은 데이터베이스 스키마를 처리하는 방법에 따라 다릅니다. EF 마이그레이션을 사용하여 코드에서 스키마를 업데이트하는 경우 색인을 separate migration step 또는 together with the table creation으로 추가 할 수 있습니다.

+0

모델에서 f1 및 f2 열 인덱스를 만드는 간단한 방법이 있습니까? 나는 Code-First 방식을 사용하고있다. –

+0

이주 단계에서 작성해야합니다. 모델 클래스에 속성을 포함시켜 색인을 만들 수는 없습니다. –

+0

내 질문에 EDIT를 추가했습니다. 도와 주셔서 감사합니다 –

관련 문제