.NET Core ORM 类库Petapoco中对分页Page添加Order By对查询的影响
介绍
最近一直在使用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>>(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<petapocopage>();
Console.WriteLine("Hello World!");
}
}
public class PetapocoPage
{
public static IDatabase Database =&gt;
new Database(DatabaseConfiguration.Build()
.UsingConnectionString(
"server=192.168.88.3;port=3306;uid=root;pwd=biobase;database=BiobaseProductionQrCode;")
.UsingProvider<mariadbdatabaseprovider>());
[Benchmark]
public void PageOrderBy()
{
Database.Page<productmanufacturelinedetaildto>(1, 20, "order by CreateDate");
}
[Benchmark]
public void Page()
{
Database.Page<productmanufacturelinedetaildto>(1, 20);
}
[Benchmark]
public void PageOrderByAsync()
{
Database.PageAsync<productmanufacturelinedetaildto>(1, 20, "order by CreateDate");
}
[Benchmark]
public void PageAsync()
{
Database.PageAsync<productmanufacturelinedetaildto>(1, 20);
}
}
}
对性能测试结果可以看到,使用Order By
对性能的影响确实是非常大。
.NET Core ORM 类库Petapoco中对分页Page添加Order By对查询的影响的更多相关文章
- 微型ORM:PetaPoco 学习资料整理
github地址:https://github.com/CollaboratingPlatypus/PetaPoco petapoco 实体中字段去掉关联(类似于EF中的NotMap) 微型ORM:P ...
- .Net Core ORM选择之路,哪个才适合你 通用查询类封装之Mongodb篇 Snowflake(雪花算法)的JavaScript实现 【开发记录】如何在B/S项目中使用中国天气的实时天气功能 【开发记录】微信小游戏开发入门——俄罗斯方块
.Net Core ORM选择之路,哪个才适合你 因为老板的一句话公司项目需要迁移到.Net Core ,但是以前同事用的ORM不支持.Net Core 开发过程也遇到了各种坑,插入条数多了也特别 ...
- .NET Core 3.0或3.1 类库项目中引用 Microsoft.AspNetCore.App
本文为原创文章.首发:http://www.zyiz.net/ 在 ASP.NET Core 3.0+ web 项目中已经不需要在 .csproj 中添加对 Microsoft.AspNetCore. ...
- ORM之PetaPoco错误--VS中NUGet程序包管理安装PetaPoco
一般在Vs中使用PetaPoco的时候都是使用NuGet程序包管理来安装PetaPoco的,如果你在安装PetaPoco前设置了ConnectionString,那么PetaPoco中的T4模板会自动 ...
- 【译】微型ORM:PetaPoco【不完整的翻译】
PetaPoco是一款适用于.Net 和Mono的微小.快速.单文件的微型ORM. PetaPoco有以下特色: 微小,没有依赖项……单个的C#文件可以方便的添加到任何项目中. 工作于严格的没有装饰的 ...
- 【译】微型ORM:PetaPoco
PetaPoco是一款适用于.Net 和Mono的微小.快速.单文件的微型ORM. PetaPoco有以下特色: 微小,没有依赖项……单个的C#文件可以方便的添加到任何项目中. 工作于严格的没有装饰的 ...
- 【译】微型ORM:PetaPoco【不完整的翻译】(转)
出处:http://www.cnblogs.com/youring2/archive/2012/06/04/2532130.html PetaPoco是一款适用于.Net 和Mono的微小.快速.单文 ...
- C#轻型ORM框架PetaPoco试水
近端时间从推酷app上了解到C#轻微型的ORM框架--PetaPoco.从github Dapper 开源项目可以看到PetaPoco排第四 以下是网友根据官方介绍翻译,这里贴出来. PetaPoco ...
- 轮子来袭 vJine.Core Orm 之 01_快速体验
vJine.Core 是.Net环境下C#类库,在其包含的众多功能中ORM功能尤为突出,现简介如下. 一.支持的数据库: SQLite, MySQL, MS SQL, Oracle. 二.使用方法: ...
随机推荐
- iOS面试题整理带答案
iOS面试题整理带答案 找工作,面试是避免不了的! 而技术开发面试,问一些技术相关的问题是必须的,最新的技术可能人人都趋之若鹜,但有些原理和基础的也希望都有了解. 这里整理了一些iOS相关 ...
- Hbase入门(一)——初识Hbase
本文将介绍大数据的知识和Hbase的基本概念,作为大数据体系中重要的一员,Hbase弥补了Hadoop只能离线批处理的不足,支持存储小文件,随机检索.而这种特性使得Hbase对于实时计算体系的事件存储 ...
- python excel to mysql
import sys import xlrd import pymysql import math import json from collections import OrderedDict # ...
- String的优化 Stringbuffer和Stringbuilder
string 上次说到string是最好衍生出来的一种字符类型,实现原理是由char[].我们知道数组一旦创建时不可更改的,所以每一次进行字符串的拼接都是在new一个新的字符串进行添加,这样的话对内存 ...
- Dubbo源码解析(一)服务发现
一.Dubbo源码模块 官网地址 源码地址 1.1 源码模块组织 Dubbo工程是一个Maven多Module的项目,以包结构来组织各个模块. 核心模块及其关系,如图所示: 1.2 模块说明 dubb ...
- 在Debian上用FVWM做自己的桌面
用FVWM做自己的桌面 Table of Contents 1. 前言 2. 学习步骤 3. 准备 3.1. 软件包 3.2. 字体 3.3. 图片 3.4. 参考资料 4. 环境 5. 布局 6. ...
- 小鸟初学Shell编程(七)变量引用及作用范围
变量引用 那么定义好变量,如何打印变量的值呢?举例下变量引用的方式. ${变量名}称作为对变量的引用 echo ${变量名}查看变量的值 ${变量名}在部分情况下可以省略成 $变量名 [root@li ...
- docker 运行容器时指定--sysctl参数来设置系统参数
指定--sysctl参数来设置系统参数,通过这些参数来调整系统性能,Docker通过一个 ValidateSysctl函数来限制 sysctl参数可以传入的项,源码如下: // docker/opts ...
- java8 函数接口
[前言] java8新特性 java8 Optional使用总结 java8 lambda表达式 Java 8 时间日期使用 1.函数式接口新特性 java8中引入了函数式接口新特性,使用@Funct ...
- idea在debug模式下的启动特别慢?
程序执行到这里时,一直卡着不动? 原因可能是在方法上打了断点导致的: 将方法上的断点去掉,点击[Done]即可.