2011-09-15 5 views
0

25,000 행의 데이터를 반환하는 데 약 1 분이 걸리는 SQL SP가 있습니다. (다중 데이터 세트가 리턴 될 수 있음).효율적으로 XElement에 대한 SqlDataReader를 사용합니다.

현재이 값을 XElement/XDocument로 변환하여 C# 메서드에서 여러 보고서 결과를 얻으려는 시도가 30 분 이상 소요되며 Sql Connection \ Command Timeout이 30 분이 소요됩니다.

어디서나 비효율적 일 수 있으므로 다음 전환 코드를 개선 할 수있는 곳이면 누구나 문제를 해결하고 찾을 수 있습니까?

public void xyzCall() 
{ 
    .... 
    XElement result = SqlDataReadertoXML(sqlcommand.ExecuteReader()); 
    .... 
} 

데이터베이스에 액세스 할 수있는 경우

private XElement SqlDataReadertoXML(SqlDataReader datareader) 
    { 
      XElement results = new XElement("ResultSets"); 

      // Read Next RecordSet 
      do 
      { 
       XElement result = new XElement("ResultSet"); 
       //Read Next Row in this RecordSet 
       while (datareader.Read()) 
       { 
        XElement datanode = new XElement("Item"); 

        // Read Each Column in this RecordSet 
        for (int i = 0; i < datareader.FieldCount; i++) 
        { 
         // Node.Attr("Name") = Column Name, Node.Value = Field 
         if (datareader.GetName(i) != "") datanode.Add(new XElement(datareader.GetName(i), datareader[i].ToString())); 
        } 
        result.Add(datanode); 
       } 
       results.Add(new XElement(result)); 
      } while (datareader.NextResult()); 

      datareader.Close(); 
      return results; 
    } 
+2

LINQ to XML이 병목 현상인지 확인하십시오. LINQ to XML 비트를 가져 오지만 여전히 모든 데이터를 가져 오는 경우 (여전히 'datareader.GetName (i)'및 'datareader [i] .ToString()') 얼마나 걸리나요? –

답변

4

, 나는 당신이 SP를 수정하거나 선호하는 XML 데이터를 반환하는 새로운 SP를 작성하는 것이 좋습니다 변환 기능 형식이 더 빨라질 것입니다. 대규모 데이터 세트의 경우 XML 인 메모리를 작성하는 것은 좋지 않습니다.

XML의 AUTO FOR
  1. - 각 컬럼 XML 단순 중첩 트리는 XML RAW FOR 단일 요소
  2. 로 표현되는 - 결과 세트의 각 행 EXPLICIT XML위한 일반적인 요소 태그
  3. 변신 - 미리 정의 된 XML 형식은 XML 경로
  4. 결과 집합 생성됩니다 - 명시 적 모드와 동일한 기능의 많은,하지만, 요소와 속성은 구문처럼 XPATH로 구축 할 수

Reference

0

나는 명백한 문제는 보이지 않지만 메모리에있는 250K 행을 CPU로 구울 수 있다는 것은 놀랄 일이 아니다. 당신이 할 수있는

한 가지

내가 대신 SQL 서버의 for xml 절을 사용하는 프로세스 (예를 들어으로 결과 집합 당 하나 개의 스레드를)이지는 //입니다!

관련 문제