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对性能的影响确实是非常大。

  • 相关阅读:
    SQLMAP注入教程-11种常见SQLMAP使用方法详解
    VS2012/2013/2015/Visual Studio 2017 关闭单击文件进行预览的功能
    解决 IIS 反向代理ARR URLREWRITE 设置后,不能跨域跳转 return Redirect 问题
    Spring Data JPA one to one 共享主键关联
    JHipster 问题集中
    Spring Data JPA 定义超类
    Spring Data JPA查询关联数据
    maven命名
    maven仓库
    Jackson读取列表
  • 原文地址:https://www.cnblogs.com/sesametech-netcore/p/11726779.html
Copyright © 2011-2022 走看看