数据库查询性能 LinqDB vs Sql查询
使用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查询的更多相关文章
- Atitit oodbms的查询,面向对象的sql查询jpa jpql hql
Atitit oodbms的查询,面向对象的sql查询jpa jpql hql 1.1. 标准API历史1 1.2. JPA定义了独特的JPQL(Java Persistence Query Lang ...
- 视图查询的数据和sql查询的数据不一样
视图查询的数据和sql查询的数据不一样. 手动刷新视图 exec sp_refreshview 视图名称
- 【数据库】数据库入门(四): SQL查询 - SELETE的进阶使用
集合操作常用的集合操作主要有三种:UNION(联合集).INTERSECT(交叉集).EXCEPT(求差集).以上三种集合的操作都是直接作用在两个或者多个 SQL 查询语句之间,将所有的元组按照特定的 ...
- (25)ASP.NET Core EF查询(复杂查询运算符、原生SQL查询、异步查询)
1.复杂查询运算符 在生产场景中,我们经常用到LINQ运算符进行查询获取数据,现在我们就来了解下生产场景经常出现几种复杂查询运算符. 1.1联接(INNER JOIN) 借助LINQ Join运算符, ...
- 发送json-简单的传参查询和简单的sql查询
简单的传参查询并转化为json using System; using System.Collections.Generic; using System.Linq; using System.Web; ...
- 关于同时查询父子名称的SQL查询语句的写法 id name parentId parentName .
parentid是1就是id为1的公司的子公司 如图 查询出所有的信息后 由于我要呈现的是parentName 不是parentId所以想问下SQL语句怎么写 谢谢啦~~:) 解法: SELECT s ...
- [转] 利用SET STATISTICS IO和SET STATISTICS TIME 优化SQL Server查询性能
首先需要说明的是这篇文章的内容并不是如何调节SQL Server查询性能的(有关这方面的内容能写一本书),而是如何在SQL Server查询性能的调节中利用SET STATISTICS IO和SET ...
- 利用SET STATISTICS IO和SET STATISTICS TIME 优化SQL Server查询性能
首先需要说明的是这篇文章的内容并不是如何调节SQL Server查询性能的(有关这方面的内容能写一本书),而是如何在SQL Server查询性能的调节中利用SET STATISTICS IO和SET ...
- Sql Server查询性能优化之走出索引的误区
据了解绝大多数开发人员对于索引的理解都是一知半解,局限于大多数日常工作没有机会.也什么没有必要去关心.了解索引,实在哪天某个查询太慢了找到查询条件建个索引就ok,哪天又有个查询慢了,再建立个索引就是, ...
随机推荐
- http://t.cn/xxxxx的短链接如何生成?
var convertStr = encodeURIComponent(urlStr); //转换的原链接可能存在"&"这样的特殊符号,导致原链接的某些字段会被当做ajax ...
- Qt之高DPI显示器(二) - 自适配解决方案分析
目录 一.回顾 二.框架说明 1.ICallDPIChanged 2.IDPIHelper 3.悬浮窗体管理器 三.方案分析 1.窗口大小 2.字体大小 3.间距 4.图标 四.相关文章 原文链接:Q ...
- 小白学 Python 爬虫(15):urllib 基础使用(五)
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- 小白学 Python 爬虫(16):urllib 实战之爬取妹子图
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- 阿里巴巴的 Kubernetes 应用管理实践经验与教训
作者 | 孙健波(天元) 阿里巴巴技术专家 导读:本文整理自孙健波在 ArchSummit 大会 2019 北京站演讲稿记录.首先介绍了阿里巴巴基于 Kubernetes 项目进行大规模应用实践过程 ...
- openstack网络(二)
连接物理服务器 单网卡 多网卡 跨主机安装网络服务 使用单个控制节点安装 使用专用网络节点安装 连接物理服务器 每个物理主机所需的网卡数量取决于云平台使用领域,组织的安全性和性能要求以及硬件的可用性. ...
- MyBatis框架的基本配置
MyBatis的基本配置文件: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE config ...
- Rest微服务案例
数据库 数据库名称为Product; 创建api子工程,项目名为springcloud_api Product实体类 public class Product implements Serializa ...
- Codeves-5037线段树4加强版(线段树? 。。。分块)
维护一个序列,要求支持下列2种操作: add a b c:区间[a,b]中每个数加上c count a b:查询区间[a,b]中有多少数是k的倍数(k为给定常数) 输入描述 Input Descrip ...
- Python 入门必学经典知识点笔记【肯定有你不知道的】
前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:实验楼 Python 作为近几年越来越流行的语言,吸引了大量的学员开始学 ...