2012-10-10 1 views
0

저는 성능 교육을하고 있으며이를 향상시킬 수있는 기회가 있는지 궁금합니다. 무엇보다 시도하지 않고이 정보를 쿼리합니다. DB 스키마 또는 데이터 변경.쿼리 최적화의 과제 -이 linq 쿼리를 조정할 수 있습니까

아래의 쿼리는을 실행하는 데 약 200ms가 걸립니다. 나는 야심적이지만, 도전하는 것은 무너 뜨릴 길이라는 것입니다. ADO.NET을 사용하거나 SP를 사용하거나 SQL 쿼리를 사용할 준비가되었지만 데이터를 변경할 수는 없습니다. 또한 EmpTable에는 약 2,000 만 개의 행이 있습니다. 파라 미드와 일치하는 레코드 하나를 선택합니다.

누구나 이것이 더 이상 최적화 할 수 있다고 생각하십니까?

Log.Time() 
      using (MyDataContext db = MyDataContext.GetContext()) 
      { 
       db.ObjectTrackingEnabled = false; 
       var _Query = from t in db.EmpTable 
          where t.id == paramId 
          select t; 

       if (!_Query.Any()) 
        return null; 
      } 
      Log.Time() -- 200 ms approx 
+0

이미 쿼리를 프로파일 링 했습니까? 코드로 변경할 부분이 많지 않으므로 테이블에 적절한 인덱스를 추가해야합니다. – 48klocs

+1

해시 테이블에 데이터를 한 번로드 한 다음 메모리에서 paramId를 검색하십시오. 쿼리 실행 시간을 많이 줄일 수 있다고 생각하지 않습니다. – LeffeBrune

+1

성능이 문제가되는 경우 linq을 사용하지 않는 것이 좋습니다. 왜냐하면 생성되는 SQL이 때때로 난독 화 될 수 있기 때문입니다. – jTC

답변

0

linq를 사용하여 약간의 오버 헤드가 있습니다 (그러나 어쨌든 미세 최적화를하고 있습니다). 대신 원시 SQL을 실행하여 성능 변화가 있는지 확인할 수 있습니다.

using (MyDataContext db = MyDataContext.GetContext()) 
{ 
    var exists = db.ExecuteQuery<bool>(@" 
     SELECT CASE WHEN EXISTS(SELECT NULL FROM EmpTable where t.id == {0}) 
     THEN CAST(1 As bit) 
     ELSE CAST(0 As bit) END", paramId); 
    if(exists) 
     return null; 
} 

GetContext() 또한 컨텍스트를 만드는 것 이상을하고 있습니까?

+0

GetContext는 내가 최적화 된 곳에서 약간의 시간이 걸렸다. 도움이되기 때문에 이것을 대답으로 표시했다. –

1

귀하의 검색어는 매우 단순 해 보입니다. 귀하는 이에 대해 많은 것을 개선 할 수 없습니다.

먼저 성능을 향상시키기 위해이 쿼리에 최적화 된 인덱스를 추가 할 수 있는지 확인해야합니다.

실행중인 쿼리에 대한 쿼리 실행 계획을 가져 와서 문제 영역을 찾으십시오. 이것은 실제로 데이터베이스 튜닝으로 해결할 수있는 문제처럼 보입니다.

관련 문제