2017-12-13 14 views
4

내가 LINQ 쿼리에서 초보자 해요 내 쿼리가 하나 개의 방법 광석 서로를 향상시킬 수 있는지 궁금 해요 :Linq에 간단한 쿼리 개선

long vehid = json.VehicleId.Value; 
DateTime date = DateTime.Parse(json.date.Value); 

var Alerts = (from t2 in entities.Alerts.AsNoTracking() 
       where 
       t2.GeneratedTimeLocal.Year == date.Year 
       && t2.GeneratedTimeLocal.Month == date.Month 
       && t2.GeneratedTimeLocal.Day == date.Day 
       && (t2.AlertType == 2 || t2.AlertType == 3) 
       && t2.vId == vid 
       select new 
       { 
        GeneratedTimeLocal = t2.GeneratedTimeLocal, 
        OptionalText = t2.OptionalText 
       }); 

return Alerts; 

문제는 경고 데이터 테이블이의 엄청난 금액을 가지고 있다는 것입니다 날마다 증가하는 데이터가 있으며 지금은 다소 느립니다. 경고 데이터 테이블의 GeneratedTimeLocal 필드는 datetimeoffset 유형입니다 (7). 이 쿼리를 향상시킬 수있는 방법이 있습니까?

+0

당신은 'DataTable'이라고 말하지만 그것이 SQL 데이터베이스라고 가정합니다. SQL에서 동등한 쿼리를 실행하면 매우 빠릅니까? – Equalsk

+3

문제는 LINQ에 없으며 DB에 있습니다. LINQ 쿼리는 SQL로 변환되므로 성능 향상을 위해 해당 인덱스를 개선해야합니다 (예 : 인덱스 사용). – Sefe

+4

한 가지 옵션은 년, 월, 일 대신 날짜 범위를 확인하는 것입니다. 기본적으로 2017-12-13을 원하면 2017-12-13 00 : 00 : 00.000에서 2017-12-13 23 : 59 : 59.999의 범위가 필요합니다. 그런 다음 더 빠른 쿼리와 각 행을 치고 년, 월 및 일을 꺼내야하는 날짜 열에 대해 색인을 생성하십시오. 물론 필터의 다른 열에 대한 색인 생성도 도움이 될 것입니다. 결과 쿼리를 캡처하고 DB에 대한 SQL 분석기를 통해 실행하여 인덱스에 대한 힌트를 얻으십시오. – juharr

답변

3

쿼리를 향상시키기 위해 날짜 범위를 정의하십시오. 그런 다음 쿼리 실행 계획을 확인하고 새 인덱스가 필요한지 또는 기존 인덱스를 변경할 것인지 결정합니다. 한편

long vehid = json.VehicleId.Value; 
DateTime dateFrom = DateTime.Parse(json.date.Value).Date; // date with no time 
DateTime dateTo = dateFrom.AddDays(1); // add one day to create the date range 

var Alerts = (from t2 in entities.Alerts.AsNoTracking() 
       where 
       t2.GeneratedTimeLocal >= dateFrom 
       && t2.GeneratedTimeLocal <= dateTo 
       && (t2.AlertType == 2 || t2.AlertType == 3) 
       && t2.vId == vid 
       select new 
       { 
        GeneratedTimeLocal = t2.GeneratedTimeLocal, 
        OptionalText = t2.OptionalText 
       }); 

return Alerts; 

, 당신이 ToList을 (할 때까지이 쿼리는 예를 들어,) 실행되지 않습니다 기억 해요.

는이 인덱스를보십시오 :

CREATE INDEX IX_Alert_GeneratedTimeLocal_vId_AlertType_with_include ON 경고 (GeneratedTimeLocal, VID,을 alertType) 난 당신이 SQL 서버를 사용하고 있으리라 믿고있어 (OptionalText)

을 포함한다. 테이블이 거대한 경우 필터 된 인덱스를 시도 할 수도 있습니다. 이 링크를 확인하십시오 : https://docs.microsoft.com/en-us/sql/relational-databases/indexes/create-filtered-indexes

+1

답장을 보내 주셔서 감사합니다! :) – Dana