最近一直在使用Petapoco+Entity Framework Core結合開發一套系統。git
使用EFCore進行Code First編碼,使用PMC命令生成數據庫表的信息。github
使用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類型,對於不一樣的主鍵進行分頁查詢時也有較大影響。
圖一
app
圖二異步
使用Order by
加載頁面的耗時狀況ide
對出現的問題,使用StopWatch進行監視運行時間的長短,使用了分頁的兩種方法,區別是否加Order By
語句,組成成以下四種狀況:性能
代碼以下:測試
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進行一次性能測試,對使用的數據表的實體類不在列出
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); } } }
對性能測試結果能夠看到,使用Order By
對性能的影響確實是很是大。