Sql server 报表中的计算与存储过程中的计算

Sql server 报表中的计算与存储过程中的计算,sql-server,tsql,stored-procedures,reporting-services,database-performance,Sql Server,Tsql,Stored Procedures,Reporting Services,Database Performance,我正在生成一个报告,其中包含一个作为所需列之一的计算: SELECT .... sum(SFLI.PLANNEDVOLUME) * PTS.KILOGRAMSPERUNIT as [WEIGHT], FROM .... GROUP BY .... 我团队的另一位开发人员说,最好将计算移到报表中,而不是将其留在存储过程中,因为它产生了一个糟糕的执行计划。我做了一些研究,似乎将计算转移到报告中会对大型数据集造成不利影响 所以我的问题是,将计算留在存储过程中是否非常糟糕?我非

我正在生成一个报告,其中包含一个作为所需列之一的计算:

SELECT
   ....
   sum(SFLI.PLANNEDVOLUME) * PTS.KILOGRAMSPERUNIT as [WEIGHT],
FROM
   ....
GROUP BY
   ....
我团队的另一位开发人员说,最好将计算移到报表中,而不是将其留在存储过程中,因为它产生了一个糟糕的执行计划。我做了一些研究,似乎将计算转移到报告中会对大型数据集造成不利影响

所以我的问题是,将计算留在存储过程中是否非常糟糕?我非常确信SQL Server足够聪明,可以并行地完成任务,甚至执行计划也不会那么糟糕。我错了吗


PS:没有分组,我们讨论的是250K行,分组产生了250行。

< P>将计算移动到报表,意味着SSR Web服务器将通过代码(C?C++)完成工作,而不是通过DB引擎优化器运行它。如果你在做大量的字符串操作,那么SSRS可能比SQL做得更快,但是在你的情况下,看起来你在做一个数值计算,我肯定会让SQL来处理,除非有人告诉你,你让服务器崩溃了。如果是,还可以考虑将查询作为夜间批处理过程运行到数据集市中。正如@scsimon所说,这实际上取决于每个场景在您的环境中运行的速度,因此您不能依赖于您同事的经验法则


个人,我有很多使用相同或相似数据集的报告,所以在SQL中进行计算对我更有意义,因为我可以通过改变基础的PROC。< > /P> < P>改变所有报告,将计算移动到报表只是意味着SSR Web服务器将通过代码(C?C++)来完成工作。而不是通过db引擎优化器运行SQL。如果你在做大量的字符串操作,那么SSRS可能比SQL做得更快,但是在你的情况下,看起来你在做一个数值计算,我肯定会让SQL来处理,除非有人告诉你,你让服务器崩溃了。如果是,还可以考虑将查询作为夜间批处理过程运行到数据集市中。正如@scsimon所说,这实际上取决于每个场景在您的环境中运行的速度,因此您不能依赖于您同事的经验法则


就我个人而言,我有很多使用相同或类似数据集的报表,因此使用SQL进行计算对我来说更有意义,因为我可以通过更改基础过程来更改所有报表。

这取决于太多。。。但是您是否测试过在您的环境中哪个更快?另一个考虑因素是代码重用。如果让数据不聚合是有意义的,这样其他应用程序和报表就可以以不同的方式调用和聚合数据,那么就需要考虑了。250k行很小。此外,可以改进糟糕的执行计划。一个糟糕的执行计划并不总是一件坏事。让我们看看执行计划,也许我们能帮上忙。这里没有一个真正的答案。我坚信表示层应该尽可能薄。考虑如下:我有一个客户,增加了一个新的风险评级。他们不得不审查、修改和验证数千份报告,而我只是将新项目添加到映射表中。数据库设计用于处理数据,而报告用于表示数据。我处理过大量的数据集和计算,很容易使报告失败,数据库可以更容易地处理这种情况。因此,根据我10多年的经验或报告,除非太简单,否则总是使用数据库中的数据进行计算。我们所要做的只是“一个糟糕的执行计划”。我还要补充一点,说当通用业务逻辑可以进入数据库时,将其放入报表中是“不好的”……这取决于太多了。。。但是您是否测试过在您的环境中哪个更快?另一个考虑因素是代码重用。如果让数据不聚合是有意义的,这样其他应用程序和报表就可以以不同的方式调用和聚合数据,那么就需要考虑了。250k行很小。此外,可以改进糟糕的执行计划。一个糟糕的执行计划并不总是一件坏事。让我们看看执行计划,也许我们能帮上忙。这里没有一个真正的答案。我坚信表示层应该尽可能薄。考虑如下:我有一个客户,增加了一个新的风险评级。他们不得不审查、修改和验证数千份报告,而我只是将新项目添加到映射表中。数据库设计用于处理数据,而报告用于表示数据。我处理过大量的数据集和计算,很容易使报告失败,数据库可以更容易地处理这种情况。因此,根据我10多年的经验或报告,除非太简单,否则总是使用数据库中的数据进行计算。我们所要做的只是“一个糟糕的执行计划”。我还要补充一点,当通用业务逻辑可以进入数据库时,将其放入报表中是“不好的”