Asp.net core 高实体框架核心执行时间
我构建了一个简单的Asp.Net核心MVC应用程序,用于在工作中显示MSSQL数据库视图中的数据。从SSMS查询此视图时,执行时间平均约为100ms。当在我的应用程序中执行相同的查询时,执行时间从~800毫秒到~1.5秒不等 以下是来自控制器的LINQ: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
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,并且表上有任何索引。我们感兴趣的是我们处理了多少行。