在SQL存储过程或程序

时间:2018-04-13 08:47:18

标签: c# sql asp.net-mvc performance stored-procedures

我是一家公司的实习生,我和我的实习生都负责创建报告仪表板。我们正在使用MVC,一个API和SQL Server。

目前,我们使用9种不同的存储过程获取仪表板的数据。这些存储过程使用聚合函数(即某人在其他事物中做了多少销售)进行一些计算,并根据日期范围(以及其他一些过滤器,如产品)进行过滤。一般来说,一个存储过程结果集返回大约100到200行,如果日期范围过滤器设置为一个月,则从数据库中的大约70 000行原始数据计算得出。所以我们最多得到9个表,每个表100-200行,以填充我们的仪表板

我们的问题是用户可能会更改各种过滤器,这些过滤器目前要求我们再次从数据库中获取所有9个结果集,并且目前有点慢 - 刷新或更长时间需要大约15秒

我团队中的一位实习生想要更改代码,以便以原始格式从数据库中调用所有数据(即每个存储过程中数据库中的70 000行),而不进行过滤,然后应用用户过滤器和C#中的计算。当然这会取出日期范围过滤器,这意味着数据库中的所有数据都将被返回,因此每个存储过程将返回大约2 520 000行,而不是70 000行,因为数据库大约是3年...而且当然,每个月的总行数会增加。

我不知道这是不是一个好主意......我不知道它是否会提高性能。所以我基本上有两个主要问题:

  1. c#能否比SQL更快更有效地运行这些计算(一个人的销售量)
  2. 将有9个表格,大约250万行数据(并且计数)每个被调用到前端不会导致一切都放慢速度,使任何好处无效
  3. 另一个建议是花时间改进存储过程本身,并改变前端以并行顺序调用那些存储过程,这就是我们现在所做的。

    解答: 好的,所以在阅读完所有回复后,前进的方向似乎是修复那些存储过程并提高其性能。虽然c#可能会更快地进行计算,但它决不会弥补移动数据和存储数据所需的资源,而且那些存储过程不应该像它们一样慢。

    我们可以使用包含过滤器的c#来做这件事,但在SQL中做它似乎更好。

    我可以选择每个人的输入作为答案吗?

1 个答案:

答案 0 :(得分:2)

使用存储过程进行计算是个好主意。它节省了时间。确保所有计算都不在一个存储过程中完成。您可以创建不同的过程,并有一个最终过程来组合所有存储过程。此外,您也可以使用函数。使用sql server的属性对您有利。存储过程比在c#中进行计算更快。确保在c#中调用存储过程时设置超时时间。它非常有用,否则你不会得到预期的结果。