使用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[]);
  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[]);
  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[]);
  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[]);
  20. return modelList;
  21. }

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

首次查询:

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

二次查询:

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

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

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

数据库查询性能 LinqDB vs Sql查询的更多相关文章

  1. Atitit oodbms的查询,面向对象的sql查询jpa jpql hql

    Atitit oodbms的查询,面向对象的sql查询jpa jpql hql 1.1. 标准API历史1 1.2. JPA定义了独特的JPQL(Java Persistence Query Lang ...

  2. 视图查询的数据和sql查询的数据不一样

    视图查询的数据和sql查询的数据不一样. 手动刷新视图 exec sp_refreshview  视图名称

  3. 【数据库】数据库入门(四): SQL查询 - SELETE的进阶使用

    集合操作常用的集合操作主要有三种:UNION(联合集).INTERSECT(交叉集).EXCEPT(求差集).以上三种集合的操作都是直接作用在两个或者多个 SQL 查询语句之间,将所有的元组按照特定的 ...

  4. (25)ASP.NET Core EF查询(复杂查询运算符、原生SQL查询、异步查询)

    1.复杂查询运算符 在生产场景中,我们经常用到LINQ运算符进行查询获取数据,现在我们就来了解下生产场景经常出现几种复杂查询运算符. 1.1联接(INNER JOIN) 借助LINQ Join运算符, ...

  5. 发送json-简单的传参查询和简单的sql查询

    简单的传参查询并转化为json using System; using System.Collections.Generic; using System.Linq; using System.Web; ...

  6. 关于同时查询父子名称的SQL查询语句的写法 id name parentId parentName .

    parentid是1就是id为1的公司的子公司 如图 查询出所有的信息后 由于我要呈现的是parentName 不是parentId所以想问下SQL语句怎么写 谢谢啦~~:) 解法: SELECT s ...

  7. [转] 利用SET STATISTICS IO和SET STATISTICS TIME 优化SQL Server查询性能

    首先需要说明的是这篇文章的内容并不是如何调节SQL Server查询性能的(有关这方面的内容能写一本书),而是如何在SQL Server查询性能的调节中利用SET STATISTICS IO和SET ...

  8. 利用SET STATISTICS IO和SET STATISTICS TIME 优化SQL Server查询性能

    首先需要说明的是这篇文章的内容并不是如何调节SQL Server查询性能的(有关这方面的内容能写一本书),而是如何在SQL Server查询性能的调节中利用SET STATISTICS IO和SET ...

  9. Sql Server查询性能优化之走出索引的误区

    据了解绝大多数开发人员对于索引的理解都是一知半解,局限于大多数日常工作没有机会.也什么没有必要去关心.了解索引,实在哪天某个查询太慢了找到查询条件建个索引就ok,哪天又有个查询慢了,再建立个索引就是, ...

随机推荐

  1. http://t.cn/xxxxx的短链接如何生成?

    var convertStr = encodeURIComponent(urlStr); //转换的原链接可能存在"&"这样的特殊符号,导致原链接的某些字段会被当做ajax ...

  2. Qt之高DPI显示器(二) - 自适配解决方案分析

    目录 一.回顾 二.框架说明 1.ICallDPIChanged 2.IDPIHelper 3.悬浮窗体管理器 三.方案分析 1.窗口大小 2.字体大小 3.间距 4.图标 四.相关文章 原文链接:Q ...

  3. 小白学 Python 爬虫(15):urllib 基础使用(五)

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  4. 小白学 Python 爬虫(16):urllib 实战之爬取妹子图

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  5. 阿里巴巴的 Kubernetes 应用管理实践经验与教训

    作者 | 孙健波(天元)  阿里巴巴技术专家 导读:本文整理自孙健波在 ArchSummit 大会 2019 北京站演讲稿记录.首先介绍了阿里巴巴基于 Kubernetes 项目进行大规模应用实践过程 ...

  6. openstack网络(二)

    连接物理服务器 单网卡 多网卡 跨主机安装网络服务 使用单个控制节点安装 使用专用网络节点安装 连接物理服务器 每个物理主机所需的网卡数量取决于云平台使用领域,组织的安全性和性能要求以及硬件的可用性. ...

  7. MyBatis框架的基本配置

    MyBatis的基本配置文件: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE config ...

  8. Rest微服务案例

    数据库 数据库名称为Product; 创建api子工程,项目名为springcloud_api Product实体类 public class Product implements Serializa ...

  9. Codeves-5037线段树4加强版(线段树? 。。。分块)

    维护一个序列,要求支持下列2种操作: add a b c:区间[a,b]中每个数加上c count a b:查询区间[a,b]中有多少数是k的倍数(k为给定常数) 输入描述 Input Descrip ...

  10. Python 入门必学经典知识点笔记【肯定有你不知道的】

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:实验楼 Python 作为近几年越来越流行的语言,吸引了大量的学员开始学 ...