介绍
最近一直在使用Petapoco+Entity Framework Core结合开发一套系统。
使用EFCore进行Code First编码,使用
使用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类型,对于不同的主键进行分页查询时也有较大影响。
使用OrderBy的耗时情况
使用Order by加载页面的耗时情况
解决方法测试耗时
码代码,未有时
对出现的问题,使用StopWatch进行监视运行时间的长短,使用了分页的两种方法,区别是否加Order By
语句,组成成如下四种情况:
PageAsync Order by
PageAsync
Page Order by
Page
代码如下:
运行后台输出的日志信息,可以看到对于是否加Order By
对查询耗时的影响是非常大的,对是否使用异步方法对耗时也有部分的影响
Benchmark测试
对于上述的四种情况再次使用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 => 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); } }
}
Benchmark测试结果
对性能测试结果可以看到,使用Order By
对性能的影响确实是非常大。