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

  • 相关阅读:
    linux安装JDK
    linux安装redis
    springmvc+spring-data-jpa+hibernate环境搭建与配置
    利用spring的ApplicationListener监听某一类事件的发生
    利用spring的ApplicationListener实现springmvc容器的初始化加载
    springmvc和activemq的整合使用
    spring读取properties和其他配置文件的几种方式
    UDP协议发包的使用(DatagramSocket、DatagramPacket)
    IIS服务器多域名证书绑定443端口解决方案
    sql 分组取最新的数据sqlserver巧用row_number和partition by分组取top数据
  • 原文地址:https://www.cnblogs.com/kybs0/p/11740729.html
Copyright © 2020-2023  润新知