针对数据库视图的EF查询非常慢

时间:2013-11-22 10:03:20

标签: c# asp.net performance entity-framework

我有一个简单的Web应用程序,使用MVC和EF4.0。我在我的工作站上本地安装了VS 2010和SQL Server 2008 Express。

我有这个慢功能,我尝试了一些技巧来加快速度,但没有成功。我已经看过这个链接:

Maximizing Performance with the Entity Framework 4.0 in an ASP.NET Web Application : The Official Microsoft ASP.NET Site

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条记录。

1 个答案:

答案 0 :(得分:0)

好的,停止抱怨。

我已在生产服务器上导出代码并针对SQL Server 2005进行了测试。

不再有延迟,查询几乎立即执行。

所以,毕竟,这个问题似乎只与我的本地 SQL Server 2008 Express 有关。 (这是一个令人讨厌的问题)