数据库查询性能 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,哪天又有个查询慢了,再建立个索引就是, ...
随机推荐
- 2019-2020-5 20199317《Linux内核原理与分析》第五周作业
第4章 系统调用的三层机制(上) 1 用户态.内核态和中断 大多数程序员在写程序时很难离开系统调用,与系统调用打交道的方式是通过库函数的方式,库函数用来把系统调用给封装起来. 计算机的硬件资源是有限 ...
- 2019-2020-1 20199304《Linux内核原理与分析》第一周作业
通过对Linux基础课程的学习,我对Linux的背景以及和Windows的区别有了了解, Linux 平台:大都为开源自由软件,用户可以修改定制和再发布,由于基本免费没有资金支持,部分软件质量和体验欠 ...
- windows系统tomcat上开发的j2ee程序,如何适配linux系统上奔跑的websphere7
公司需要将几个windows系统tomcat中间件下开发的j2ee系统部署到linux系统websphere7中间件下去运行. 这就需要做系统的适配工作.由于时间比较久了,具体问题就不详细写了.把这个 ...
- 转:关于JAVA项目中CLASSPATH路径详解
在dos下编译Java程序,就要用到classpath这个概念,尤其是在没有设置环境变量的时候.classpath就是存放.class等编译后文件的路径. javac:如果当前你要编译的Java文件中 ...
- 自学python中的心得
以后的日子里我将与可爱的亲们一起度过我自学python的岁月,请博客园里的大佬们监督与见证.
- react-native 相对项目路径导入组件 ___ babel-plugin-module-resolver
babel-plugin-module-resolver 是一个Babel模块解析插件, 在.babelrc中可以配置模块的导入搜索路径. 为模块添加一个新的解析器.这个插件允许你添加新的" ...
- linux 安装jmeter
一 下载jdk sudo apt install oracle-java8-installer 二 网站下载 jmeter 三 对jmeter文件夹 赋权 我都是777 chmod -R 777 ap ...
- python pyHook安装
Hook安装 哇 这东西可真费劲 主要有pyhook和pyhook3 两种 每个都要根据系统版本和python版本 分成各种小版本 具体安装 一.可以在cmd 中输入 pip install pyh ...
- Python中的input你真会吗?
前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:一米阳光里的晴天娃娃 python中的input()方法是在控制台可 ...
- ARTS-S python把非汉语和非字母的字符替换成空格
# coding: utf-8 import re text = "aa[bb,aa#cWc中a国" FILTER_PUNTS = re.compile("[^\u4E0 ...