数据库查询性能 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,哪天又有个查询慢了,再建立个索引就是, ...
随机推荐
- SpringBoot整合log4j2进行日志配置及防坑指南
写在前面 最近项目经理要求将原先项目中的日志配置logBack,修改为log4j2,据说是log4j2性能更优于logback,具体快多少,网上有说快10多倍,看来还是很快的,于是新的一波挑战又开始了 ...
- node - 流 浅析
概念 流(stream)是 Node.js 中处理流式数据的抽象接口. stream 模块用于构建实现了流接口的对象. Node.js 提供了多种流对象. 例如,HTTP 服务器的请求和 proces ...
- 笔记||Python3之面向对象
面向对象编程:简称OOP. 是一种程序设计思想.oop把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 在python中,所有数据类型都可以视为对象,也可以自定义对象.自定义的对象数据类 ...
- USB3.0之高速视频传输测试 双目相机(mt9p031、mt9m001)带宽高达300M测试 配合isensor测试 500万像素15fps
最近完善了下USB3.0的视频开发测试,主要优化了FPGA程序和固件,及其同步方式.对带宽和图像效果进行了仔细的测试 开发板架构(2CMOS+FPGA+2DDR2+USB3.0) 评估板底板配合2个M ...
- 轻轻松松学会 DRF Django REST framework
据我了解,目前的IT行业的大部分后端开发,都是需要进行前后端分离的,而前后端分类必不可少的是rest 规范,以下是django rest framework的学习路径: DRF Django REST ...
- 一遍文章搞清楚VO、DTO、DO、PO的概念、区别
作者:Cat Qi 概念: VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来. DTO(Data Transfer Object):数据传输对 ...
- mysql外连接
一,起因 在学习一个新知识之前,最好先了解一下你为何要学习这个知识,这个知识或技术能帮你做什么,可以给你带来哪些帮助.因此我先交代一下写这篇随笔的起因. 我在做项目的时候遇到了一个比较有意思的情况, ...
- 【玩转SpringBoot】给自动配置来个整体大揭秘
上一篇文章中提到的条件注解,只是自动配置整体解决方案中的一个环节而已,可以说是管中窥豹. 本文就逐步擦除迷雾,让整体浮现出来,这样就会有一个宏观的认识. 除了写代码之外,还能干点什么? 提到“配置”这 ...
- SSM-配置tkmybatis
引言 Mybatis 与 Hibernate的一个很大的区别就是Mybatis所有的数据库操作语句都需要自己写,对于简单的单表操作来说是比较烦琐的.因此有人就开发了tk.mybatis插件,通过这个插 ...
- rsync实现服务器之间同步目录文件
一般情况下 服务环境一般有三种 dev 开发环境 test 测试环境 prod 生产环境 环境多了,不可避免的事是一些重复的操作,部署什么的 能不能在开发环境打包后,直接同步到测试环境呢?(毕竟重 ...