介绍

最近一直在使用Petapoco+Entity Framework Core结合开发一套系统。

使用EFCore进行Code First编码,使用PMC命令生成数据库表的信息。

使用Petapoco进行数据库的常规操作。并且结合PetaPoco.SqlKata的使用,减少了编写SQL语句的工作量,对提升开发效率有很大的帮助。Petapoco对数据库的支持非常的全,包括常规的一下数据库:SQL Server,SQL Server CE,MS Access,SQLite,MySQL,MariaDB,PostgreSQL,Firebird DB和Oracle。当然SQL Server为默认的支持。PetaPoco.SqlKata支持的数据库也是非常全的,包括:SqlServer, MySql, Postgres, Firebird, SQLite, Oracle。

## 遇到的问题

在数据库操作过程中,发现每个Controller的Index页面加载的非常缓慢,加载完成大约需要5s的时间,在浏览器端等待的时间相对来说是非常长的一个时间。对于出现的问题终于有时间进行解决一下了。

先来看一下未使用Order By加载页面的耗时情况,第一个图中涉及的表的主键为guid类型,第二个图中涉及的主键为ulong类型,对于不同的主键进行分页查询时也有较大影响。



图一

图二

优化后运行情况

使用Order by加载页面的耗时情况



图三



图四


## 进行验证OrderBy对时间的影响

对出现的问题,使用StopWatch进行监视运行时间的长短,使用了分页的两种方法,区别是否加Order By语句,组成成如下四种情况:

  • PageAsync Order by
  • PageAsync
  • Page Order by
  • Page

代码如下:

Stopwatch stop = new Stopwatch();
stop.Start();
var pages = await _context.PageAsync<productdto>(page, itemsPerPage, "order by id");
stop.Stop();
_logger.Information($" Order By Async查询的执行时间:{stop.Elapsed}");
stop.Restart();
var pages2 = await _context.PageAsync<productdto>(page, itemsPerPage );
stop.Stop();
_logger.Information($"Async查询的执行时间:{stop.Elapsed}");
//_logger.Information($"SQL:{_context.LastSQL}"); stop.Restart();

var ps = _context.Page<productdto>(page, itemsPerPage, "order by id"); stop.Stop();

_logger.Information($"Order By查询的执行时间:{stop.Elapsed}"); stop.Restart();

var ps2 = await _context.PageAsync<productdto>(page, itemsPerPage); stop.Stop();

_logger.Information($"查询的执行时间:{stop.Elapsed}");

stop.Restart(); var x = _mapper.Map<page<productviewmodel>&gt;(pages);

stop.Stop();

_logger.Information($"Mapper的执行时间:{stop.Elapsed}");

结果

运行后台输出的日志信息,可以看到对于是否加Order By对查询耗时的影响是非常大的,对是否使用异步方法对耗时也有部分的影响

Benchmark对Page的性能测试

对于上述的四种情况再次使用Benchmark进行一次性能测试,对使用的数据表的实体类不在列出

namespace PetaPocoPageBenchMark
{
class Program
{
static void Main(string[] args)
{
        var summary = BenchmarkRunner.Run&lt;petapocopage&gt;();
Console.WriteLine("Hello World!");
}
} public class PetapocoPage
{
public static IDatabase Database =&amp;gt;
new Database(DatabaseConfiguration.Build()
.UsingConnectionString(
"server=192.168.88.3;port=3306;uid=root;pwd=biobase;database=BiobaseProductionQrCode;")
.UsingProvider&lt;mariadbdatabaseprovider&gt;()); [Benchmark]
public void PageOrderBy()
{
Database.Page&lt;productmanufacturelinedetaildto&gt;(1, 20, "order by CreateDate");
} [Benchmark]
public void Page()
{
Database.Page&lt;productmanufacturelinedetaildto&gt;(1, 20);
} [Benchmark]
public void PageOrderByAsync()
{
Database.PageAsync&lt;productmanufacturelinedetaildto&gt;(1, 20, "order by CreateDate");
} [Benchmark]
public void PageAsync()
{
Database.PageAsync&lt;productmanufacturelinedetaildto&gt;(1, 20);
}
}

}

对性能测试结果可以看到,使用Order By对性能的影响确实是非常大。

.NET Core ORM 类库Petapoco中对分页Page添加Order By对查询的影响的更多相关文章

  1. 微型ORM:PetaPoco 学习资料整理

    github地址:https://github.com/CollaboratingPlatypus/PetaPoco petapoco 实体中字段去掉关联(类似于EF中的NotMap) 微型ORM:P ...

  2. .Net Core ORM选择之路,哪个才适合你 通用查询类封装之Mongodb篇 Snowflake(雪花算法)的JavaScript实现 【开发记录】如何在B/S项目中使用中国天气的实时天气功能 【开发记录】微信小游戏开发入门——俄罗斯方块

    .Net Core ORM选择之路,哪个才适合你   因为老板的一句话公司项目需要迁移到.Net Core ,但是以前同事用的ORM不支持.Net Core 开发过程也遇到了各种坑,插入条数多了也特别 ...

  3. .NET Core 3.0或3.1 类库项目中引用 Microsoft.AspNetCore.App

    本文为原创文章.首发:http://www.zyiz.net/ 在 ASP.NET Core 3.0+ web 项目中已经不需要在 .csproj 中添加对 Microsoft.AspNetCore. ...

  4. ORM之PetaPoco错误--VS中NUGet程序包管理安装PetaPoco

    一般在Vs中使用PetaPoco的时候都是使用NuGet程序包管理来安装PetaPoco的,如果你在安装PetaPoco前设置了ConnectionString,那么PetaPoco中的T4模板会自动 ...

  5. 【译】微型ORM:PetaPoco【不完整的翻译】

    PetaPoco是一款适用于.Net 和Mono的微小.快速.单文件的微型ORM. PetaPoco有以下特色: 微小,没有依赖项……单个的C#文件可以方便的添加到任何项目中. 工作于严格的没有装饰的 ...

  6. 【译】微型ORM:PetaPoco

    PetaPoco是一款适用于.Net 和Mono的微小.快速.单文件的微型ORM. PetaPoco有以下特色: 微小,没有依赖项……单个的C#文件可以方便的添加到任何项目中. 工作于严格的没有装饰的 ...

  7. 【译】微型ORM:PetaPoco【不完整的翻译】(转)

    出处:http://www.cnblogs.com/youring2/archive/2012/06/04/2532130.html PetaPoco是一款适用于.Net 和Mono的微小.快速.单文 ...

  8. C#轻型ORM框架PetaPoco试水

    近端时间从推酷app上了解到C#轻微型的ORM框架--PetaPoco.从github Dapper 开源项目可以看到PetaPoco排第四 以下是网友根据官方介绍翻译,这里贴出来. PetaPoco ...

  9. 轮子来袭 vJine.Core Orm 之 01_快速体验

    vJine.Core 是.Net环境下C#类库,在其包含的众多功能中ORM功能尤为突出,现简介如下. 一.支持的数据库: SQLite, MySQL, MS SQL, Oracle. 二.使用方法: ...

随机推荐

  1. JsonConvert 转DateTime类型为json 带T

    在调用接口的时候  将Model转换成json Datetime类型多了个T 用的是Newtonsoft.Json.dll 版本v4.5.0.0 代码:paramsjson = JsonConvert ...

  2. 小程序开发初体验,从静态demo到接入Bmob数据库完全实现

    之前我胖汾公司年会.问我能不能帮忙搞个小程序方便他们进行游戏后的惩罚/抽奖使用.出了个简单的设计图.大概三天左右做了个简单的小程序.目前提交审核了.对于写过一小段时间vue来说小程序很容易上手.写法和 ...

  3. Leetcode 121.买股票的最佳时机

    题目描述: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出 ...

  4. 2018年蓝桥杯java b组第八题

    标题:日志统计 小明维护着一个程序员论坛.现在他收集了一份"点赞"日志,日志共有N行.其中每一行的格式是: ts id 表示在ts时刻编号id的帖子收到一个"赞" ...

  5. (java实现)单向循环链表

    什么是单向循环链表 单向循环链表基本与单向链表相同,唯一的区别就是单向循环链表的尾节点指向的不是null,而是头节点(注意:不是头指针). 因此,单向循环链表的任何节点的下一部分都不存在NULL值. ...

  6. 【SQL server初级】SQL索引(一)

    SQL索引[一](此文章为“数据库性能优化二:数据库表优化”附属文章之一) SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开 ...

  7. 更该clover软件图标(任务栏显示)

    1.首先介绍一个Clover软件,Clover 的功能就是给资源管理器加上 Chrome 一样的标签页,像下面这样,你会爱上它的效率,和浏览器一样的操作方式. 2.它自带的系统图标比较丑(虽然作者说挺 ...

  8. ThinkPHP5 支付宝 电脑与手机支付扩展库

    ThinkPHP5 电脑与手机支付扩展库(2017年9月18日) 使用说明 在默认配置情况下,将文件夹拷贝到根目录即可, 其中extend目录为支付扩展目录, application\extra\al ...

  9. Github | 吴恩达新书《Machine Learning Yearning》完整中文版开源

    最近开源了周志华老师的西瓜书<机器学习>纯手推笔记: 博士笔记 | 周志华<机器学习>手推笔记第一章思维导图 [博士笔记 | 周志华<机器学习>手推笔记第二章&qu ...

  10. BeetleX服务网关之限流和缓存

    限流和缓存相关是网关中两个非常重要的功能,前者是保障服务更可靠地运行,后者则可以大大提高应用的吞吐能力.Beetlex.Bumblebee微服务网关提供了两个扩展插件来实现这两个功能,分别是Beetl ...