Asp.net mvc 查询速度慢,希望使用存储过程(ASP.Net MVC3、通用Repo、POCO)

Asp.net mvc 查询速度慢,希望使用存储过程(ASP.Net MVC3、通用Repo、POCO),asp.net-mvc,linq,entity-framework,repository-pattern,Asp.net Mvc,Linq,Entity Framework,Repository Pattern,我有一个MVC3应用程序,它使用分为不同层的POCO类。我还实现了一个通用的回购模式 我有一个仪表板,它使用剑道UI图表进行管理,以查看实时统计数据。随着数据库的增长,仪表板的速度越来越慢。我发现这些原因: 记录每天都在增长 每个图表都调用repo来获取所有行,以便使用LINQ计算统计数据 Automapper正在创建我的模型以查看模型 我想通过使用数据库中的存储过程来加速这个过程,以获得统计数据所需的准确数字。我不知道我应该如何实施这个。。。尽管感觉很不对!有什么建议吗 带有回购代码的控制器示

我有一个MVC3应用程序,它使用分为不同层的POCO类。我还实现了一个通用的回购模式

我有一个仪表板,它使用剑道UI图表进行管理,以查看实时统计数据。随着数据库的增长,仪表板的速度越来越慢。我发现这些原因:

  • 记录每天都在增长
  • 每个图表都调用repo来获取所有行,以便使用LINQ计算统计数据
  • Automapper正在创建我的模型以查看模型
  • 我想通过使用数据库中的存储过程来加速这个过程,以获得统计数据所需的准确数字。我不知道我应该如何实施这个。。。尽管感觉很不对!有什么建议吗

    带有回购代码的控制器示例

    Public Class DashboardController
        Inherits BaseController
    
        Private ticketRepo As MaintenanceTicketsRepository
    
        Public Sub New()
            Me.ticketRepo = New MaintenanceTicketsRepository(New TicketContext)
        End Sub
    
        Function Chart_OpenItems() As ActionResult
            Dim tickets As IList(Of MaintenanceTicket) = ticketRepo.GetAll().Include(Function(p) p.Priority).Include(Function(s) s.Status).OrderBy(Function(o) o.PriorityId).ToArray()
             'Do some work with repo then dispose'
        End Function
    
        Function Chart_ClosedItems() As ActionResult
            Dim tickets As IList(Of MaintenanceTicket) = ticketRepo.GetAll().Include(Function(p) p.Priority).Include(Function(s) s.Status).OrderBy(Function(o) o.PriorityId).ToArray()
             'Do some work with repo then dispose'
        End Function
    End Class
    

    试图回答你的问题。如果您可以通过在数据离开SQL Server之前使用存储过程来聚合数据,从而减少进入模型的数据量,那么就开始吧。实际的实现细节将取决于您的ORM设置类型。如果您可以将1800行减少到>100行,您几乎肯定会看到速度的提高。

    存储过程不会比参数化良好的即席查询更快。。。仅仅切换到存储过程很可能不会提高速度。您需要找到性能瓶颈(糟糕的查询、缺少索引)——而不是浪费时间将所有内容重写到存储过程中……我明白了,我担心这一点。当使用EF Profiler时,它显示对于我的每个图表控件调用,我返回1800行,每个行大约为1-3秒,总加载时间为5-6秒。有没有办法只返回一次回购协议,并在每次图表点击时使用它的实例?这对我有好处吗?我不同意,实现存储过程是错误的。如果移动1800行并将其聚合为单个值或一组值,我认为存储过程是一种合理而谨慎的做法。让SQL做它擅长的事情,聚合数据。i、 e.如果“使用repo做一些工作,然后进行处置”只是指.Count(),然后实现一个SP。如果它比这更复杂,您可能希望将它保留在类中。@PlTaylor:我是说,从使用查询返回1800行改为使用存储过程返回相同的1800行不会让事情变得更快。但你是对的——如果Chuck可以重写他的逻辑,并使用存储过程在服务器上执行一些工作,只返回50行而不是1800行——那么存储过程肯定是有意义的。但那是因为你改变了逻辑。@marc_我完全同意。如果存储过程减少了传递给模型的数据量,那么它就开始有意义了。我将尝试一下,看看它是如何工作的。我说这感觉不对,但出于纯粹主义的心态,我想做任何事情,而不使用SQL direct中的任何东西。使用他们擅长的工具。C#(和其他编程语言)非常适合复杂逻辑。SQL在存储、检索和聚合数据方面非常出色。我在这里给出答案,非常感谢你们的帮助。我同意你所说的使用这些工具来达到他们擅长的目的,我的测试证明了这一点。我有很多工作要完成,但在一个查询中,我从700ms+增加到了10-20。很高兴看到它成功了。如果有任何关于学习整个堆栈的争论,这就是它。