2016-03-19 6 views
3

私はC#アプリケーションを持っています。実行すると、約50,000〜100,000の値が計算されます。私はこれらの値をSQL Serverデータベースに保存します。以下のコードは正常に動作しますが、データをデータベースにアップロードするのに非常に時間がかかります。パフォーマンスを向上させるためにできることがあれば教えてください。現在、1分以上かかります。は、データベースへのデータアップロードのパフォーマンスを改善します。

以下にMy SQLテーブルを示します。データを挿入する際に余分な処理時間がかかると私は考えているので、私はここで主キーを使用すべきですか?

tblResultEquityCurve 

DTime (smalldatetime) - primary key 
Equity numeric(18,4) 

C#コード

void exEquityCurveMT() 
     { 
      DeletePreviousResultsFromTable("Result_EquityCurve"); 

      Spliter[] split = MTSplitter(Account.EquityHistory.Count); 
      MultiThreadToDataBase[] mtDB = new MultiThreadToDataBase[NUMCORES]; 

      Task[] taskDB = new Task[NUMCORES]; 
      for (int i = 0; i < taskDB.Length; i++) 
      { 
       List<structEquity> eqyList = Account.EquityHistory.GetRange((int)split[i].rowStart, split[i].numRows); 
       mtDB[i] = new MultiThreadToDataBase(); 
       taskDB[i] = Task.Factory.StartNew(mtDB[i].exEquityCurve, eqyList); 
      } 
      try 
      { 
       Task.WaitAll(taskDB); 
      } 
      catch (AggregateException ex) 
      { 
       ExceptionDispatchInfo.Capture(ex.InnerException).Throw(); 
      } 

     } 




public void exEquityCurve(object dataObj) 
     { 
      List<structEquity> dataList = (List<structEquity>)dataObj; 

      using (connection = new SqlConnection(connectionString)) 
      { 
       connection.Open(); 

       using (SqlCommand commandEquity = new SqlCommand("dbo.InsertEquityCurve", connection)) 
       { 
        commandEquity.CommandType = System.Data.CommandType.StoredProcedure; 
        commandEquity.Parameters.Add("@dtTime", System.Data.SqlDbType.SmallDateTime); 
        commandEquity.Parameters.Add("@Equity", System.Data.SqlDbType.Float); 

        for (int i = 0; i < dataList.Count; i++) 
        { 
         commandEquity.Parameters["@dtTime"].Value = dataList[i].dTime; 
         commandEquity.Parameters["@Equity"].Value = dataList[i].Equity; 
         commandEquity.ExecuteNonQuery(); 
        }         
       } 

       connection.Close(); 
      } 
     } 
+1

アップロードが単なる行単位の挿入である場合は、[SqlBulkCopy](https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy %28v = vs.110%29.aspx) –

+0

ありがとう! SqlBulkCopyは非常に迅速になります – mHelpMe

答えて

5

ループからDBストアドプロシージャを呼び出すことをお勧めではありません。 JamezのようにSqlBulkCopyを使用するか、ユーザー定義のテーブル型を使用してテーブル値のパラメータを受け入れる別のストアドプロシージャを作成してください。hereを参照してください。 MSSQLのユーザ定義型には保守性の問題があるため、代わりにXMLを使用することができますが、sproc契約と署名の宣言が少なくなります。 どちらの方法でも、1つの非同期呼び出しですべてのデータをデータベースに渡すことが目標です。

関連する問題