将数据一次性加载到DataSet与逐行从DB内读取的性能比较
在开发中经常会遇到将当前处理批次的数据与数据库内的数据做校验的情况,通过有两种处理方式:
1、将待校验的数据一次性加载到DataSet,再将待校验的数据与DataSet内的数据逐行比较。
2、待校验数据在使用时,才从DB取出那一条数据进行比对。
第一种方法要每次在DataSet中查找数据,第二种直接定位到具体数据,两种方式在数据量为20W条记录的,第一种的处理时长是第二种的10倍。
string strConnect = "Data Source=localhost;Initial Catalog=cmsw;Integrated Security=True; Application Name=pgq"; DataSet dsCode = new DataSet(); using (SqlConnection sqlConn = new SqlConnection(strConnect)) { sqlConn.Open(); SqlDataAdapter sda = new SqlDataAdapter("SELECT top 200000 TRANCODE from JobRecord ", sqlConn); sda.Fill(dsCode, "Test"); sqlConn.Close(); } DateTime dt1 = DateTime.Now; foreach (DataRow dr in dsCode.Tables[0].Rows) { using (SqlConnection sqlConn = new SqlConnection(strConnect)) { string code = dr["TRANCODE"].ToString(); SqlCommand cmd = new SqlCommand("SELECT * from JobRecord WHERE TRANCODE=@TRANCODE ", sqlConn); cmd.Parameters.AddWithValue("TRANCODE", code); sqlConn.Open(); SqlDataReader dataRead = cmd.ExecuteReader(); if (dataRead.Read()) { Console.WriteLine("One Cycle:{0}",dataRead["TRANCODE"]); } sqlConn.Close(); } } DateTime dt2 = DateTime.Now; TimeSpan ts1 = dt2 - dt1; Console.Clear(); Console.WriteLine("Total MilSeconds:{0}", ts1.Milliseconds); DataSet dsTest2 = new DataSet(); using (SqlConnection sqlConn = new SqlConnection(strConnect)) { sqlConn.Open(); SqlDataAdapter sda = new SqlDataAdapter("SELECT top 200000 * from JobRecord ", sqlConn); sda.Fill(dsTest2, "dsTest2"); sqlConn.Close(); } int serialNo = 0; while (serialNo < 200000) { Random rand = new Random(); int index = rand.Next(1, 200000); var code = dsTest2.Tables[0].AsEnumerable() .Where(r => r.Field<string>("TRANCODE") == dsCode.Tables[0].Rows[index]["TRANCODE"].ToString()) .Select(r => r.Field<string>("TRANCODE")).ElementAtOrDefault(0); Console.WriteLine("Scend Cycle:{0}",code); serialNo++; } DateTime dt3 = DateTime.Now; TimeSpan ts2 = dt3 - dt2; Console.WriteLine("First Result, TotalSeconds:{0};\r\nSecond Result TotalSeconds:{1}", ts1.TotalSeconds, ts2.TotalSeconds); Console.ReadLine();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏