gpt4 book ai didi

c# - 提高将数据上传到数据库的性能

转载 作者:行者123 更新时间:2023-11-30 14:50:43 25 4
gpt4 key购买 nike

我有一个 C# 应用程序。当它运行时,它会计算大约 50,000 到 100,000 个值。然后我将这些值存储到 sql server 数据库中。下面的代码工作正常,但是将数据上传到数据库需要很长时间。我想知道我是否可以做些什么来提高性能?目前需要一分多钟。

我的 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正如 Jamez 所建议的那样,或创建另一个存储过程以通过用户定义的表类型接受表值参数,请参阅 here . MSSQL 中的用户定义类型存在已知的可维护性问题,因此您可以改用 XML,尽管它确实会使您的存储过程契约(Contract)和签名声明性降低。无论哪种方式,目标都是在一次异步调用中将所有数据传递给数据库。

关于c# - 提高将数据上传到数据库的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36104383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com