使用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查询的更多相关文章

  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. 爬虫新宠requests_html 带你甄别2019虚假大学 #华为云·寻找黑马程序员#

    python模块学习建议 学习python模块,给大家个我自己不专业的建议: 养成习惯,遇到一个模块,先去github上看看开发者们关于它的说明,而不是直接百度看别人写了什么东西.也许后者可以让你很快 ...

  2. 基于Docker快速搭建ELK

    [摘要] 本文基于自建的Docker平台速搭建一套完整的ELK系统,相关的镜像直接从Docker Hub上获取,可以快速实现日志的采集和分析检索. 准备镜像 l  获取ES镜像:docker pull ...

  3. 【nodejs原理&源码赏析(4)】深度剖析cluster模块源码与node.js多进程(上)

    [摘要] 集群管理模块cluster浅析 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 概述 cluster模块是node.js中用于实现和管理 ...

  4. 共享共建会让中国的5G加速吗?

    9月9号,中国联通正式公告,已与中国电信签署<5G网络共建共享框架合作协议书>,将在全国范围内合作共建5G接入网络. 这则消息堪称爆炸性新闻,但却看不到什么深度分析,评论文章除了强调&qu ...

  5. luogu P5596 【XR-4】题

    题目背景 xht37 喜欢分块,以至于对一道不需要分块的题也要分块做. 题目描述 有一个长度为 nn 的序列,xht37 现在想分块维护它. PinkRabbit 要求他只准将序列分成 PRPR 种长 ...

  6. Xcode 10 Error: Multiple commands produce

    目录 Xcode 9.4.1运行react-native 可以,但是在Xcode 10运行报错,报错信息如下: 解决方法 1. 选择 File > Project Settings (或者 Fi ...

  7. Java中的等待唤醒机制—至少50%的工程师还没掌握!

    这是一篇走心的填坑笔记,自学Java的几年总是在不断学习新的技术,一路走来发现自己踩坑无数,而填上的坑却屈指可数.突然发现,有时候真的不是几年工作经验的问题,有些东西即使工作十年,没有用心去学习过也不 ...

  8. 基于leaflet的标绘功能(一)--可调整的圆

    标绘功能是指在电子地图上可以标注点.线.面.复杂多边形等图形.主要操作包括上图.调整(大小.方向.位置).网络存储等.根据具体的业务场景,也可以做到协同标绘等特色功能.其中,要求每个图形有若干关键点控 ...

  9. 计蒜客-蒜场抽奖(AC自动机+状态压缩DP)

    题解:题意不再说了,题目很清楚的. 思路:因为N<=10,所以考虑状态压缩 AC自动机中 val[1<<i]: 表示第i个字符串.AC自动机中fail指针是指当前后缀在其他串里面所能 ...

  10. BZOJ 1051: [HAOI2006]受欢迎的牛(SCC)

    1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 8172  Solved: 4470[Submit][Sta ...