数据库查询性能 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    /// 
 2     /// 获得数据列表
 3     /// 
 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     /// 
16     /// 执行查询语句,返回DataSet
17     /// 
18     /// 查询语句
19     /// DataSet
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     /// 
 2     /// 获得数据列表
 3     /// 
 4     public List GetCoursewares()
 5     {
 6         DataSet ds = GetList(string.Empty, "Courseware");
 7         //通过映射,DataSet转实体类
 8         var modelList = DataTableConverter.ToList(ds.Tables[0]);
 9         return modelList;
10     }
11     /// 
12     /// 获得数据列表
13     /// 
14     public List GetCoursewares(string queryText)
15     {
16         var queryString = $"Name like '%{queryText}%'";
17         DataSet ds = GetList(queryString, "Courseware");
18         //通过映射,DataSet转实体类
19         var modelList = DataTableConverter.ToList(ds.Tables[0]);
20         return modelList;
21     }

我们来看下查询数据的性能,还是同一数据表

首次查询:

  • 查询2.7万条数据,耗时1612ms
  • 查询指定的1条数据,也要耗时196ms

二次查询:

  • 查询2.7万条数据,耗时1484ms 
  • 查询指定的1条数据,耗时59ms

此方案耗时较多,应该是反射伤性能,放弃

2. 直接给数据类字段属性赋值

DataTable转数据类:

 

 1         /// 
 2         /// 将DataTable转换成Entity列表
 3         /// 
 4         /// 
 5         /// 
 6         public List ConvertDtToModelList(DataTable dt)
 7         {
 8             List list = new List();
 9             foreach (DataRow dr in dt.Rows)
10             {
11                 list.Add(DataRowToModel(dr));
12             }
13             return list;
14         }
15         /// 
16         /// 得到一个对象实体
17         /// 
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     /// 
 2     /// 获得数据列表
 3     /// 
 4     public List GetCoursewares()
 5     {
 6         DataSet ds = GetList(string.Empty, "Courseware");
 7         //通过字段赋值,DataSet转实体类
 8         var modelList = ConvertDtToModelList(ds.Tables[0]);
 9         return modelList;
10     }
11     /// 
12     /// 获得数据列表
13     /// 
14     public List 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查询方案查询数据性能会好很多

你可能感兴趣的:(数据库查询性能 LinqDB vs Sql查询)