我有一个简单的Web应用程序,使用MVC和EF4.0。我在我的工作站上本地安装了VS 2010和SQL Server 2008 Express。
我有这个慢功能,我尝试了一些技巧来加快速度,但没有成功。我已经看过这个链接:
Performance Considerations for EF5
但对我来说,信息量有点压倒性。至少,所以我需要一些指示。
public List<VRapportiCT> ViewRapportiToList(string codArticolo, DateTime startDate, DateTime endDate)
{
// RapportiEntities : ObjectContext
RapportiEntities context = new RapportiEntities();
//context.VRapportiCT.MergeOption = MergeOption.NoTracking; // No improvement
// startDate = 01/01/2013
// endDate = 31/12/2013
List<VRapportiCT> myList = context.VRapportiCT
.Where(r => r.DCodArt == codArticolo && r.DStorico >= startDate && r.DStorico <= endDate)
.OrderBy(r => r.DStorico).ToList();
// 1° query Elapsed time: 8 sec.
myList = context.VRapportiCT
.Where(r => r.DCodArt == codArticolo && r.DStorico >= startDate && r.DStorico <= endDate)
.OrderBy(r => r.DStorico).ToList();
// 2° query Elapsed time: 8 sec.
return myList;
}
直接在数据库上执行的SQL查询非常快,实际上不到0.5秒(我用SQL Server Profiler测量过它)。
我在调试模式下使用VS 2010来“直观地检查”性能(但是在发布模式下编译应用程序并直接测试浏览器中的调用并没有带来任何改进)。
所有时间都用在.ToList()
来电,但到底在哪里?
PS。查询只返回非常少量的记录,比如说10条记录,从(未经过滤的)包含当然包含更多记录的视图开始; - )
因此,对我来说,草率的表现似乎与某些“EF魔法对象的树木物化和幕后连接”有关
修改 DB View T-SQL代码:
SELECT TOP (100) PERCENT L.KLinea, LTRIM(RTRIM(L.DLinea)) AS DLinea, LTRIM(RTRIM(R.DCodArt)) AS DCodArt, LTRIM(RTRIM(R.DDescArt)) AS DDescArt, N.KNota, N.DNota,
T.DStorico, CAST(DATEPART(day, T.DStorico) AS varchar) + '/' + CAST(DATEPART(month, T.DStorico) AS varchar) + '/' + CAST(DATEPART(year, T.DStorico) AS varchar)
AS Data, REPLACE(LTRIM(RTRIM(U.DTurno)), 'Turno', 'Lettera') AS Lettera, U.KTurno,
FROM dbo.TRapportiCT AS T INNER JOIN
dbo.TPersonale AS P ON T.KPersona = P.KPersona INNER JOIN
dbo.TTurni AS U ON T.KTurno = U.KTurno INNER JOIN
dbo.RRapNotCod AS R ON T.KRapporto = R.KRapporto INNER JOIN
dbo.TLinea AS L ON R.KLinea = L.KLinea INNER JOIN
dbo.TNoteCT AS N ON R.KNota = N.KNota
WHERE (P.KRuolo = 2)
ORDER BY T.DStorico, N.KOrdine
未经过滤的视图会返回54.000条记录。
答案 0 :(得分:0)
好的,停止抱怨。
我已在生产服务器上导出代码并针对SQL Server 2005进行了测试。
不再有延迟,查询几乎立即执行。
所以,毕竟,这个问题似乎只与我的本地 SQL Server 2008 Express 有关。 (这是一个令人讨厌的问题)