数据库查询性能 LinqDB vs Sql查询

2022-12-09,,,,

使用LinqDB查询Sqlite数据库数据,不管是大数据还是少量的数据,感觉特别耗时,尤其是首次查询

一个含有2.7万条数据的数据表

首次查询:

查询2.7万条数据,耗时1s
查询指定的1条数据,也要耗时750ms

二次查询:

查询2.7万条数据,耗时475ms
查询指定的1条数据,耗时73ms

我们来尝试优化一下,使用Sql语句查询

Sql查询数据库

Sql连接字符串:

     var dbRelativePath = "Dbs\\EnglishDict.db3";
var connectionString = "data source=" + System.Environment.CurrentDirectory + "\\" + dbRelativePath + ";version=3;";

Sql查询,返回DataSet集合

    /// <summary>
/// 获得数据列表
/// </summary>
public DataSet GetList(string strWhere, string tableName)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("select * ");
strSql.Append($" FROM {tableName} ");
if (strWhere.Trim() != "")
{
strSql.Append(" where " + strWhere);
}
return Query(strSql.ToString());
}
/// <summary>
/// 执行查询语句,返回DataSet
/// </summary>
/// <param name="sQLString">查询语句</param>
/// <returns>DataSet</returns>
public DataSet Query(string sQLString)
{
using (SQLiteConnection connection = new SQLiteConnection(connectionString))
{
DataSet ds = new DataSet();
try
{
connection.Open();
SQLiteDataAdapter command = new SQLiteDataAdapter(sQLString, connection);
command.Fill(ds, "ds");
}
catch (System.Data.SQLite.SQLiteException ex)
{
throw new Exception(ex.Message);
}
return ds;
}
}

DataSet数据集转数据列表

1. 使用反射,映射到Entity数据类中

见 数据库查询 - DataTable转Entity类型数据

     /// <summary>
/// 获得数据列表
/// </summary>
public List<CoursewareInfo> GetCoursewares()
{
DataSet ds = GetList(string.Empty, "Courseware");
//通过映射,DataSet转实体类
var modelList = DataTableConverter<CoursewareInfo>.ToList(ds.Tables[]);
return modelList;
}
/// <summary>
/// 获得数据列表
/// </summary>
public List<CoursewareInfo> GetCoursewares(string queryText)
{
var queryString = $"Name like '%{queryText}%'";
DataSet ds = GetList(queryString, "Courseware");
//通过映射,DataSet转实体类
var modelList = DataTableConverter<CoursewareInfo>.ToList(ds.Tables[]);
return modelList;
}

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

首次查询:

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

二次查询:

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

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

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

DataTable转数据类:

         /// <summary>
/// 将DataTable转换成Entity列表
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public List<CoursewareInfo> ConvertDtToModelList(DataTable dt)
{
List<CoursewareInfo> list = new List<CoursewareInfo>();
foreach (DataRow dr in dt.Rows)
{
list.Add(DataRowToModel(dr));
}
return list;
}
/// <summary>
/// 得到一个对象实体
/// </summary>
public CoursewareInfo DataRowToModel(DataRow row)
{
CoursewareInfo model = new CoursewareInfo();
if (row != null)
{
model.LocalId = row["LocalId"].ToString();
model.RemoteId = row["RemoteId"].ToString();
model.Name = row["Name"].ToString();
}
return model;
}

获取数据列表:

     /// <summary>
/// 获得数据列表
/// </summary>
public List<CoursewareInfo> GetCoursewares()
{
DataSet ds = GetList(string.Empty, "Courseware");
//通过字段赋值,DataSet转实体类
var modelList = ConvertDtToModelList(ds.Tables[]);
return modelList;
}
/// <summary>
/// 获得数据列表
/// </summary>
public List<CoursewareInfo> GetCoursewares(string queryText)
{
var queryString = $"Name like '%{queryText}%'";
DataSet ds = GetList(queryString, "Courseware");
//通过字段赋值,DataSet转实体类
var modelList = ConvertDtToModelList(ds.Tables[]);
return modelList;
}

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

首次查询:

查询2.7万条数据,耗时660ms
查询指定的1条数据,也要耗时191ms

二次查询:

查询2.7万条数据,耗时500ms
查询指定的1条数据,耗时58ms

此方案,数据查询性能很明显的改善。

总结:相对LINDB,使用Sql查询方案查询数据性能会好很多

数据库查询性能 LinqDB vs Sql查询的相关教程结束。

《数据库查询性能 LinqDB vs Sql查询.doc》

下载本文的Word格式文档,以方便收藏与打印。