私は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();
}
}
アップロードが単なる行単位の挿入である場合は、[SqlBulkCopy](https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy %28v = vs.110%29.aspx) –
ありがとう! SqlBulkCopyは非常に迅速になります – mHelpMe