数据库查询性能 LinqDB vs Sql查询
使用LinqDB查询Sqlite数据库数据,不管是大数据还是少量的数据,感觉特别耗时,尤其是首次查询
一个含有2.7万条数据的数据表
首次查询:
查询2.7万条数据,耗时1s
查询8条数据,也要耗时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查询方案查询数据性能会好很多
出处:
https://www.cnblogs.com/kybs0/archive/2019/10/25/11740729.html