数据库查询性能 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查询方案查询数据性能会好很多

posted @ 2019-10-25 20:33  唐宋元明清2188  阅读(485)  评论(3编辑  收藏  举报