数据库查询性能 LinqDB vs Sql查询
使用LinqDB查询Sqlite数据库数据,不管是大数据还是少量的数据,感觉特别耗时,尤其是首次查询
一个含有2.7万条数据的数据表
首次查询:
- 查询2.7万条数据,耗时1s
- 查询指定的1条数据,也要耗时750ms
二次查询:
- 查询2.7万条数据,耗时475ms
- 查询指定的1条数据,耗时73ms
我们来尝试优化一下,使用Sql语句查询
Sql查询数据库
Sql连接字符串:
1 var dbRelativePath = "Dbs\\EnglishDict.db3"; 2 var connectionString = "data source=" + System.Environment.CurrentDirectory + "\\" + dbRelativePath + ";version=3;";
Sql查询,返回DataSet集合
1 /// <summary> 2 /// 获得数据列表 3 /// </summary> 4 public DataSet GetList(string strWhere, string tableName) 5 { 6 StringBuilder strSql = new StringBuilder(); 7 strSql.Append("select * "); 8 strSql.Append($" FROM {tableName} "); 9 if (strWhere.Trim() != "") 10 { 11 strSql.Append(" where " + strWhere); 12 } 13 return Query(strSql.ToString()); 14 } 15 /// <summary> 16 /// 执行查询语句,返回DataSet 17 /// </summary> 18 /// <param name="sQLString">查询语句</param> 19 /// <returns>DataSet</returns> 20 public DataSet Query(string sQLString) 21 { 22 using (SQLiteConnection connection = new SQLiteConnection(connectionString)) 23 { 24 DataSet ds = new DataSet(); 25 try 26 { 27 connection.Open(); 28 SQLiteDataAdapter command = new SQLiteDataAdapter(sQLString, connection); 29 command.Fill(ds, "ds"); 30 } 31 catch (System.Data.SQLite.SQLiteException ex) 32 { 33 throw new Exception(ex.Message); 34 } 35 return ds; 36 } 37 }
DataSet数据集转数据列表
1. 使用反射,映射到Entity数据类中
见 数据库查询 - DataTable转Entity类型数据
1 /// <summary> 2 /// 获得数据列表 3 /// </summary> 4 public List<CoursewareInfo> GetCoursewares() 5 { 6 DataSet ds = GetList(string.Empty, "Courseware"); 7 //通过映射,DataSet转实体类 8 var modelList = DataTableConverter<CoursewareInfo>.ToList(ds.Tables[0]); 9 return modelList; 10 } 11 /// <summary> 12 /// 获得数据列表 13 /// </summary> 14 public List<CoursewareInfo> GetCoursewares(string queryText) 15 { 16 var queryString = $"Name like '%{queryText}%'"; 17 DataSet ds = GetList(queryString, "Courseware"); 18 //通过映射,DataSet转实体类 19 var modelList = DataTableConverter<CoursewareInfo>.ToList(ds.Tables[0]); 20 return modelList; 21 }
我们来看下查询数据的性能,还是同一数据表
首次查询:
- 查询2.7万条数据,耗时1612ms
- 查询指定的1条数据,也要耗时196ms
二次查询:
- 查询2.7万条数据,耗时1484ms
- 查询指定的1条数据,耗时59ms
此方案耗时较多,应该是反射伤性能,放弃
2. 直接给数据类字段属性赋值
DataTable转数据类:
1 /// <summary> 2 /// 将DataTable转换成Entity列表 3 /// </summary> 4 /// <param name="dt"></param> 5 /// <returns></returns> 6 public List<CoursewareInfo> ConvertDtToModelList(DataTable dt) 7 { 8 List<CoursewareInfo> list = new List<CoursewareInfo>(); 9 foreach (DataRow dr in dt.Rows) 10 { 11 list.Add(DataRowToModel(dr)); 12 } 13 return list; 14 } 15 /// <summary> 16 /// 得到一个对象实体 17 /// </summary> 18 public CoursewareInfo DataRowToModel(DataRow row) 19 { 20 CoursewareInfo model = new CoursewareInfo(); 21 if (row != null) 22 { 23 model.LocalId = row["LocalId"].ToString(); 24 model.RemoteId = row["RemoteId"].ToString(); 25 model.Name = row["Name"].ToString(); 26 } 27 return model; 28 }
获取数据列表:
1 /// <summary> 2 /// 获得数据列表 3 /// </summary> 4 public List<CoursewareInfo> GetCoursewares() 5 { 6 DataSet ds = GetList(string.Empty, "Courseware"); 7 //通过字段赋值,DataSet转实体类 8 var modelList = ConvertDtToModelList(ds.Tables[0]); 9 return modelList; 10 } 11 /// <summary> 12 /// 获得数据列表 13 /// </summary> 14 public List<CoursewareInfo> GetCoursewares(string queryText) 15 { 16 var queryString = $"Name like '%{queryText}%'"; 17 DataSet ds = GetList(queryString, "Courseware"); 18 //通过字段赋值,DataSet转实体类 19 var modelList = ConvertDtToModelList(ds.Tables[0]); 20 return modelList; 21 }
来看下查询数据的性能,还是同一数据表
首次查询:
- 查询2.7万条数据,耗时660ms
- 查询指定的1条数据,也要耗时191ms
二次查询:
- 查询2.7万条数据,耗时500ms
- 查询指定的1条数据,耗时58ms
此方案,数据查询性能很明显的改善。
总结:相对LINDB,使用Sql查询方案查询数据性能会好很多
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)