zoukankan      html  css  js  c++  java
  • .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>&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对性能的影响确实是非常大。

  • 相关阅读:
    JDK Base64编解码1.7和1.8的坑
    nacos部署注意点
    详解CurrentHashMap之预习篇
    SpringBoot爬坑系列
    开发之缓存与数据库优化
    jreble备注
    Unable to open debugger port (127.0.0.1:55119): java.net.SocketException "Socket closed"
    ConcurrentHashMap源码分析
    为什么要先高16位异或低16位再取模运算
    HashMap(三)之源码分析
  • 原文地址:https://www.cnblogs.com/sesametech-netcore/p/11726779.html
Copyright © 2011-2022 走看看