2011-09-15 21 views
0

私は実行に約1分かかり、25,000行のデータを返すSql SPを持っています。 (複数のデータセットを返すことができます)。c#SqlDataReaderからXElementへ効率的に

現在、これをXElement/XDocumentに変換して、いくつかのレポート結果を生成しようとしましたが、これは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

は、私が望ましいXMLでデータを返すために、あなたはSPを変更したり、新しいSPを書くことをお勧めフォーマットはより高速になります。大規模なデータセットでは、XMLをメモリ内に構築することはお勧めできません。

のXML AUTO FOR
  1. - 各列にXMLの単純なネストされたツリーは、XML RAWのための単一の要素
  2. として表現される - 結果セット内の各行は、明示的なXMLのための一般的な要素タグ
  3. に変換されます - 事前に定義されたXML形式は、XMLパスの
  4. 結果セットのために作成されます - EXPLICITモードと同じ機能の多くが、要素や属性は、構文のようにXPATHを使用して構築することができ

Reference

0

私は明らかな問題はありませんが、私はメモリ内のxmlに250K行を変換するとCPUを焼くことができます。あなたが行うことができます

ことの一つは、//(たとえばたresultSetごとに1つのスレッドを)プロセスをIZEすることです

私の代わりにSQL Serverののfor xml句を使用します!

関連する問題