.NET Core ORM 類庫Petapoco中對分頁Page添加Order By對查詢的影響

介紹

最近一直在使用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



圖三

圖四


進行驗證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<petapocopage>();
            Console.WriteLine("Hello World!");
        }
    }

    public class PetapocoPage
    {
        public static IDatabase Database =&gt;
            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對性能的影響確實是很是大。

相關文章
相關標籤/搜索