Asp.net core 高实体框架核心执行时间

Asp.net core 高实体框架核心执行时间,asp.net-core,entity-framework-core,Asp.net Core,Entity Framework Core,我构建了一个简单的Asp.Net核心MVC应用程序,用于在工作中显示MSSQL数据库视图中的数据。从SSMS查询此视图时,执行时间平均约为100ms。当在我的应用程序中执行相同的查询时,执行时间从~800毫秒到~1.5秒不等 以下是来自控制器的LINQ: public IActionResult Index() { var query = from p in _context.vWebQuery where p.Almachine == "600L" orderb

我构建了一个简单的Asp.Net核心MVC应用程序,用于在工作中显示MSSQL数据库视图中的数据。从SSMS查询此视图时,执行时间平均约为100ms。当在我的应用程序中执行相同的查询时,执行时间从~800毫秒到~1.5秒不等

以下是来自控制器的LINQ:

public IActionResult Index()
{
    var query =
    from p in _context.vWebQuery
    where p.Almachine == "600L"
    orderby p.Aldatsta
    select p;
    return View(query);
}
以下是实体类:

namespace BetaKestrel2.Models
{
    public class vWebQuery
    {
        public double Wruntim { get; set; }
        public short Wper { get; set; }
        public double Quantity { get; set; }
        [Column("Total Op TIme")]
        public double? TotalTime { get; set; }
        public string Alwon { get; set; }
        public short Alopnum { get; set; }
        public string Almachine { get; set; }
        public double Alpersta { get; set; }
        [DisplayFormat(DataFormatString = "{0:F2}")]
        public double Allen { get; set; }
        public short Alprevop { get; set; }
        [DisplayFormat(DataFormatString = "{0:d}")]     
        public DateTime Aldatsta { get; set; }
        public string Altimsta { get; set; }
        public string Alstatus { get; set; }
        public short Alperno { get; set; }
        public string Macid { get; set; }
        public string Macdesc { get; set; }
        public string Partid { get; set; }
        public string Partrevisionid { get; set; }
        public string Routingmethod { get; set; }
        public double Wqleft { get; set; }
        public string Wstate { get; set; }
        public string Wdesc { get; set; }
        public string Partdesc { get; set; }
        public string Toolid { get; set; }
        public string Childpartid { get; set; }
        public string msection { get; set; }

    }
}
和DbContext:(对.HasNoKey()使用.NETCore3.0)

结果:

信息:Microsoft.AspNetCore.Mvc.ViewFeatures.ViewResultExecutor[4] Executed ViewResult—以1540.680500000002ms执行的视图索引

信息:Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[2] 1541.4348ms内执行的操作BetaKestrel2.Controllers.BenddController.Index(BetaKestrel2)

信息:Microsoft.AspNetCore.Routing.EndpointMiddleware[1] 已执行的终结点“BetaKestrel2.Controllers.BenddController.Index(BetaKestrel2)”

信息:Microsoft.AspNetCore.Hosting.Diagnostics[2] 请求在1541.8467ms内完成200 text/html;字符集=utf-8

鉴于,在SSMS中

总执行时间124ms

我试过AsNoTracking()但没什么不同。你最后的评论让我好奇。查询返回了291行,所以我尝试了。Take(5)和执行时间下降到24ms。是否真的只是视图中foreach循环的迭代占用了所有时间

从SSMS查询此视图时,在上执行时间约为100ms 一般。在我的应用程序中执行相同查询时,执行时间 在约800毫秒到约1.5秒之间

SQL Server管理工作室(SSMS)

  • 原始SQL没有超过头部
环境足迹

把这个

var query = 
from p in _context.vWebQuery
where p.Almachine == "BENDD"
orderby p.Aldatsta
select p;
在一个计时的方块中,循环3次,取最后一次

--create dbContext here. (_context)

--start loop (run 3 times)

    --start timer

var query = ( 
            from p in _context.vWebQuery
           where p.Almachine == "BENDD"
          orderby p.Aldatsta
          select p
        ).Tolist();

    --end timer -this is what you want to compare after the 3 run.
               - yes it will be slower but you could make as non tracking 
               - should be a must fairer comparison.

-- end loop
提示-将其放入调试,在索引上放置断点。。。将查询更改为ToList(),以便它在该点执行查询,而不是在视图部分执行查询

来自测试的代码:已修改

        for (int i = 0; i <= 3; i++)
        {
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();

            var query = (from p in _context.vWebQuery
                         where p.Almachine == "600L"
                         orderby p.Aldatsta
                         select p
            ).ToList();

            stopwatch.Stop();
            Console.WriteLine(stopwatch.ElapsedMilliseconds);
        }
     .....
for(int i=0;i
从SSMS查询此视图时,在上执行时间约为100ms
平均值。当在我的应用程序中执行相同的查询时,执行时间
在约800毫秒到约1.5秒之间

SQL Server管理工作室(SSMS)

  • 原始SQL没有超过头部
环境足迹

把这个

var query = 
from p in _context.vWebQuery
where p.Almachine == "BENDD"
orderby p.Aldatsta
select p;
在一个计时的方块中,循环3次,取最后一次

--create dbContext here. (_context)

--start loop (run 3 times)

    --start timer

var query = ( 
            from p in _context.vWebQuery
           where p.Almachine == "BENDD"
          orderby p.Aldatsta
          select p
        ).Tolist();

    --end timer -this is what you want to compare after the 3 run.
               - yes it will be slower but you could make as non tracking 
               - should be a must fairer comparison.

-- end loop
提示-将其放入调试,在索引上放置断点…将查询更改为ToList(),以便它在该点执行查询,而不是在视图部分中执行查询

来自测试的代码:已修改

        for (int i = 0; i <= 3; i++)
        {
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();

            var query = (from p in _context.vWebQuery
                         where p.Almachine == "600L"
                         orderby p.Aldatsta
                         select p
            ).ToList();

            stopwatch.Stop();
            Console.WriteLine(stopwatch.ElapsedMilliseconds);
        }
     .....

用于(int i=0;i好的,首先,这个数字是返回响应的总执行时间,而不仅仅是运行查询所需的时间。有许多其他因素可能会减慢响应速度,但我们无法看到您的任何其他代码。抱歉,我对OOP还不太熟悉,仍然在思考这个问题所有。我编辑了我的问题以使其更清晰。请看我的答案,您正在测量不一样的东西,只需测量查询的执行情况,而不是额外的OOP和渲染管道。是的,1v1会更慢,但不会像EF提供给您的有用性那么多。您所用的时间可能不到3ms(可能是为什么更少取决于)刚刚看到你的更新。291行中有那么多字段(20个)的速度应该快得像24ms,所以我猜这可能与DisplayFormat和Column有关,其中一列是否包含大量文本…比如500多个字符…检查字段中数据的大小..wdesc是nvarchar(255),但该列中的最大长度是41 charsWell,首先,该数字是返回响应的总执行时间,而不仅仅是运行查询所需的时间。有许多其他因素可能会减慢响应速度,但我们无法看到您的任何其他代码。抱歉,我对OOP还相当陌生,我仍然在想这些。为了更清楚,我编辑了我的问题。看我的答案,你在衡量不同的东西,只是衡量查询的执行,而不是额外的OOP和渲染管道。是的,1v1会更慢,但没有EF给你的有用性那么多。你可能需要更少的时间han 3ms(可能是因为不太确定)刚刚看到了您的更新。291行有那么多字段(20)所有291的速度应该快得像24毫秒,所以我猜这可能与DisplayFormat和Column有关,其中一列是否包含大量文本…比如500多个字符…检查字段中数据的大小..wdesc是nvarchar(255)在这个列中的最高长度是41个字符,所以我按照你的建议做了,并且St.CytoCurror。秒表的时间是1200毫秒的平均值,以后不要修改别人的答案,而是把它包含在你自己的Q或A中,无论如何我修改了那里的……因为它没有考虑到时间的正确性,也考虑下面的发现它。正在测试ef是否正在添加
和[v].[Almachine]不是NULL < /代码>从我的理解中,它也不应该考虑删除DISPLAY格式和列,为什么表没有任何PK,并且表上有任何索引。我们感兴趣的是我们处理的行。OK所以我按照您的建议做了,Soal.Debug。秒表时间是1~200毫秒的平均值,将来不修改S。OMENE ELSE回答,而不是把它包含在你自己的Q或A中,不管怎样,我修改了那里的……因为它没有考虑时序,也正确地考虑了下面的内容,发现EF正在添加<代码>和[V]。不是NULL 从我的理解中,它也不应该考虑删除DISPLAY格式和列,为什么表没有PK,并且表上有任何索引。我们感兴趣的是我们处理了多少行。