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

我的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,尽管它确实使您增加了处理协定和签名的声明性。
无论哪种方式,目标都是通过一个异步调用将所有数据传递到数据库。

10-06 15:02
查看更多