2010-07-09 2 views
0

linq를 사용하여 데이터베이스에서 WCF 서비스의 직렬화 된 결과를 가져 오려고합니다. DB를에wcf serialize linq 결과가 대량의 SQL Server로드를 초래합니다.

표는 어느 정도 표준화하고 난 처음에 단지 스콧 Landford의 블로그처럼, Data.Linq.DataLoadOptions를 사용하여 LINQ 쿼리와 검색이에 함께 다른 데이터를 반환하고 있습니다 : http://codeexperiment.com/post/Returning-LINQ-to-SQL-Entities-From-WCF.aspx

ServerDALDataContext db = new ServerDALDataContext(); 

    System.Data.Linq.DataLoadOptions dlo = new System.Data.Linq.DataLoadOptions(); 
    // get COMPETITOR_ENTRies data along with COMPETITION 
    dlo.LoadWith<COMPETITION>(e => e.COMPETITOR_ENTRies); 
    // get dividends for competitors along with COMPETITOR_ENTRies 
    dlo.LoadWith<COMPETITOR_ENTRY>(e => e.DIVIDENDs); 
    db.LoadOptions = dlo; 

    // retrieve MEETING data from database 
    var competitions = (from c in db.COMPETITIONs 
         select c) 
     .AsEnumerable() 
     .Where(c => c.CONTROL_UPDATE_DATA.FOR_UPDATE); 
      && c.COMPETITION_DATETIME.Value.Date == dateFrom.Date); 

    // return as list    
    return competitions != null ? competitions.ToList() : null; 

도 10 초마다 정도의 WCF 서비스에 대한 비동기 요청을 보내는 서비스를 소비하는 클라이언트 응용 프로그램이 있습니다 :

여기에 관련이 내 코드의 일부입니다.

이 문제가 발생하면 실제로 SQL Server에 100 % CPU를 사용하는 정도로 오버로드되어 클라이언트에 대한 응답이 늦어지는 문제가 발생합니다. 나는 dlo.LoadWith 호출을 제거하고 응답은 의미있는 시간에옵니다.

이 문제를 해결하고 SQL 서버를 과부하하지 않는 방법에 대한 제안 사항이 있습니까?

+1

스키마, 인덱스, 샘플 데이터하시기 바랍니다. 기본적으로 당신은 열악한 디자인을 가지고 있습니다 ... – gbn

+0

이런 종류의 상황에서 좋은 접근 방법은 무엇입니까? 그게 내가 알아 내려고하는거야. – TheBoyan

+0

우리가 테이블, 인덱스 및 샘플 데이터를 사용하여 호출 한 SQL을 보여줍니다 ... 우리가 추측 할 수만 있다면 ... – gbn

답변

1
// retrieve MEETING data from database 
var competitions = (from c in db.COMPETITIONs 
        select c) 
    .AsEnumerable() 
    .Where(c => c.CONTROL_UPDATE_DATA.FOR_UPDATE); 
     && c.COMPETITION_DATETIME.Value.Date == dateFrom.Date); 

AsEnumerable ...

당신은 전체 테이블을로드하고 있습니다. 무엇


는 이런 상황에서 좋은 방법입니다?

dataContext.Log = Console.Out;을 설정하거나 SQL 프로필러를 실행하고 데이터베이스로 전송되는 내용을 확인하십시오.

두 가지 가능성 거기에서 :

  1. 당신은 데이터베이스에 원하는 결과를 가져도 필터링 된 쿼리를 보내고있다 -하지만 그들은 제대로 수행하는 것입니다. 쿼리를 SqlStudio에 넣고 "예상 실행 계획 표시"버튼을 클릭하십시오. SET STATISTICS IO ONSET STATISTICS TIME ON을 사용하고 메시지 탭을 확인하십시오. 솔루션에는 일반적으로 인덱스 추가가 포함됩니다.

  2. 잘못된 필터링 된 쿼리 또는 데이터를 조각별로 페치 (많은 왕복 횟수)하는 쿼리를 보내고 있습니다. 쿼리를 생성 한 C# 코드로 돌아가서 오류가 무엇인지 알아냅니다. 솔루션에는 일반적으로 Where를 올바르게 배치하거나 GroupBy 대신 Join을 수행하고 루프 내에서 쿼리를 실행하지 않아도됩니다. 시간 트림


적절한 날짜 필터링 :

DateTime theDate = DateTime.Now; 
    //manipulate date into a range locally. 
DateTime startDate = theDate.Date; 
DateTime endDate = startDate.AddDays(1); 

    //filter by the range - endpoint excluded. 
IEnumerable<Order> query = myDC.Orders.Where(order => 
    startDate <= order.OrderDate 
    && order.OrderDate < endDate); 
관련 문제