.NET Core ORM 类库Petapoco中对分页Page添加Order By对查询的影响

非 Y 不嫁゛ 提交于 2020-12-05 03:00:46

介绍

<p>最近一直在使用<a href="https://github.com/CollaboratingPlatypus/PetaPoco">Petapoco</a>+Entity Framework Core结合开发一套系统。</p> <p>使用EFCore进行Code First编码,使用<a href="https://mp.weixin.qq.com/s?__biz=MzI2MDQ3NDkxMA==&amp;mid=2247483979&amp;idx=1&amp;sn=94f23048f2be219cbfcabdc07da6e951&amp;chksm=ea68533add1fda2c0d0f300188e7b5a3f424d30b5608191e64d0f605c2f1306c7802188a17e8&amp;token=569544938&amp;lang=zh_CN#rd">PMC命令</a>生成数据库表的信息。</p> <p>使用Petapoco进行数据库的常规操作。并且结合<a href="https://github.com/asherber/PetaPoco.SqlKata">PetaPoco.SqlKata</a>的使用,减少了编写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。</p> ## 遇到的问题 <p>在数据库操作过程中,发现每个Controller的Index页面加载的非常缓慢,加载完成大约需要5s的时间,在浏览器端等待的时间相对来说是非常长的一个时间。对于出现的问题终于有时间进行解决一下了。</p> <p>先来看一下未使用<code data-backticks="1">Order By</code>加载页面的耗时情况,第一个图中涉及的表的主键为guid类型,第二个图中涉及的主键为ulong类型,对于不同的主键进行分页查询时也有较大影响。<br> <img id="img1571815260511" src="https://img2018.cnblogs.com/other/1746998/201910/1746998-20191023155807564-27097542.png"><br> 图一<br> <img id="img1571814209491" src="https://img2018.cnblogs.com/other/1746998/201910/1746998-20191023155807691-1470615268.png"><br> <p>图二</p><br>

优化后运行情况

<br> <p>使用<code data-backticks="1">Order by</code>加载页面的耗时情况</p><br> <img id="img1571816029379" src="https://img2018.cnblogs.com/other/1746998/201910/1746998-20191023155807759-436436837.png"><br> 图三<br> <img id="img1571816129199" src="https://img2018.cnblogs.com/other/1746998/201910/1746998-20191023155807777-711499280.png"><br> 图四</p> <hr> ## 进行验证OrderBy对时间的影响 <p>对出现的问题,使用StopWatch进行监视运行时间的长短,使用了分页的两种方法,区别是否加<code data-backticks="1">Order By</code>语句,组成成如下四种情况:</p> <ul> <li>PageAsync Order by</li> <li>PageAsync</li> <li>Page Order by</li> <li>Page</li> </ul> <p>代码如下:</p> <pre><code>Stopwatch stop = new Stopwatch(); stop.Start(); var pages = await _context.PageAsync&lt;productdto&gt;(page, itemsPerPage, "order by id"); stop.Stop(); _logger.Information($" Order By Async查询的执行时间:{stop.Elapsed}"); stop.Restart(); var pages2 = await _context.PageAsync&lt;productdto&gt;(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}"); </code></pre>

结果

<p>运行后台输出的日志信息,可以看到对于是否加<code data-backticks="1">Order By</code>对查询耗时的影响是非常大的,对是否使用异步方法对耗时也有部分的影响<br> <img id="img1571814961394" src="https://img2018.cnblogs.com/other/1746998/201910/1746998-20191023155807560-1253703252.png"></p>

Benchmark对Page的性能测试

<p>对于上述的四种情况再次使用Benchmark进行一次性能测试,对使用的数据表的实体类不在列出</p> <pre><code>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);
    }
}

} </code></pre>

<p>对性能测试结果可以看到,使用<code data-backticks="1">Order By</code>对性能的影响确实是非常大。<br> <img id="img1571815752690" src="https://img2018.cnblogs.com/other/1746998/201910/1746998-20191023155807550-1826333147.png"><productviewmodel data-tomark-pass=""></productviewmodel></p>

原文出处:https://www.cnblogs.com/sesametech-netcore/p/11726779.html

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!