常规代码性能优化的总结
今天同事发开中遇到了一个代码性能优化的问题,原本需求是:从一个数据库中查询某个表数据,存放到datatable中,然后遍历datatable,看这些数据在另一个数据库的表中是否存在,存在的话就要更新,不存在就要插入。
就这个需求本身来说很简单,但是随着数据量的增大,之前通过循环遍历的方式就出现了性能问题。我在思索片刻后,给出的建议是分页查询和利用事务批量提交。
1.利用数据库事务批量提交
using (SqlTransaction transaction = targetConnection.BeginTransaction()) { foreach (DataRow row in dataTable.Rows) { if (CheckIfDataExists(targetConnection, transaction, row)) { UpdateData(targetConnection, transaction, row); } else { InsertData(targetConnection, transaction, row); } } transaction.Commit(); } } //下面两个方法都还可以优化,需要接收批量sql语句,所以可以修改成list<SqlCommand>,然后遍历执行,此处能说明问题即可 private void UpdateData(SqlConnection connection, SqlTransaction transaction, DataRow row) { using (SqlCommand command = new SqlCommand("UPDATE YourTable SET YourUpdateStatement WHERE YourCondition", connection, transaction)) { // Add parameters to your command here, based on your update statement and condition // command.Parameters.AddWithValue("@ParameterName", row["ColumnName"]); command.ExecuteNonQuery(); } } private void InsertData(SqlConnection connection, SqlTransaction transaction, DataRow row) { using (SqlCommand command = new SqlCommand("INSERT INTO YourTable (YourColumns) VALUES (YourValues)", connection, transaction)) { // Add parameters to your command here, based on your columns and values // command.Parameters.AddWithValue("@ParameterName", row["ColumnName"]); command.ExecuteNonQuery(); } }
看到这里的时候,大家可以考虑下,以上方案还有什么优化的地方吗?
当然是有的,如果数据量持续增大,datatable这样直接加载到内存的方式恐怕会成为性能问题点吧,我们得考虑怎么优化才能避免将大数据一次性加载到内存,大部分同学第一个想到的就是分页,这个方案当然是没有错,但是还不够高级,给大家提示一个关键字“yield”,或许从聪明的你已经悟到了,接着往下看。
2.流式处理法
什么是流式处理法呢?
1 private IEnumerable<DataRow> GetDataFromSource() 2 { 3 using (SqlConnection sourceConnection = new SqlConnection(sourceConnectionString)) 4 { 5 sourceConnection.Open(); 6 7 using (SqlCommand command = new SqlCommand("SELECT * FROM YourTable", sourceConnection)) 8 { 9 using (SqlDataReader reader = command.ExecuteReader()) 10 { 11 DataTable dataTable = new DataTable(); 12 13 while (reader.Read()) 14 { 15 dataTable.LoadDataRow(reader.GetValues(), LoadOption.Upsert); 16 DataRow row = dataTable.Rows[dataTable.Rows.Count - 1]; 17 yield return row; 18 dataTable.Clear(); 19 } 20 } 21 } 22 }
在这个示例中,GetDataFromSource方法每次迭代时返回一个DataRow,而不是一次性返回所有DataRow。这样,你就可以在每次迭代时处理一个DataRow
常规优化手段
1. 代码层面:
2. Web API方面:
3. 数据库方面:
4. Nginx方面:
5. CDN方面:
6. 微服务方面:
7. 其他方面:
2024-02-19 15:27:45【出处】:https://www.cnblogs.com/Mr-Worlf/p/18020445
=======================================================================================
关注我】。(●'◡'●)
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的【因为,我的写作热情也离不开您的肯定与支持,感谢您的阅读,我是【Jack_孟】!
本文来自博客园,作者:jack_Meng,转载请注明原文链接:https://www.cnblogs.com/mq0036/p/18021229
【免责声明】本文来自源于网络,如涉及版权或侵权问题,请及时联系我们,我们将第一时间删除或更改!