【问题标题】:Summarize information from one stored procedure in another stored procedure在另一个存储过程中汇总来自一个存储过程的信息
【发布时间】:2012-02-04 15:39:27
【问题描述】:

我有一个存储过程,它不仅很大,而且非常占用内存。第一个存储过程是为详细报告创建的。第二个存储过程调用第一个存储过程,将信息放入临时表中,然后从该临时表中选择信息并进行汇总。

现在,第二个存储过程不需要详细存储过程中的所有信息,它只需要其中的一部分。

我们的 DBA 称这种方法是鲁莽的,并提出了其他建议,例如“将其保留在真实表中,以便每天运行一次”。这实际上不会发生,因为许多用户每天可以针对不同的日期范围多次运行报告。他的另一个建议是在没有临时表的情况下进行 SUM,但我不确定您如何从一个存储过程中仅选择某些字段。

我有两个问题:如果没有临时表,我将如何遵循他对 SUM 的第二个建议,如果无法做到,是否有人对用于汇总摘要报告所需数据的最佳方法有任何建议?

这两个存储过程都用于单独的报告。一份是详细报告,另一份报告是摘要。最终用户可以为不同的商店和不同的时间段运行它们。

【问题讨论】:

    标签: sql sql-server sql-server-2008 stored-procedures


    【解决方案1】:

    如果内部 SP 中的选择非常简单 - 尝试@Abe 注意到的方法

    如果数据不能以简单的视图呈现,你有两种方法:

    1. 以获取唯一需要的数据的方式重写外部过程,而不使用内部 SP
    2. 通过外部临时表或持久表仅传输需要的数据
      • 临时表的好处 - 您可以使用索引,无需维护已经不需要的数据
      • 持久化表的好处是一样的,除了你可以更精细地调整它,棕褐色临时表但是你必须为表清理而烦恼,因此 - 必须引入类似 session密钥到期日期外部清理

    【讨论】:

    • 我有一个临时表,但 DBA 说我不能使用。
    【解决方案2】:

    为什么不将数据放在视图中,然后从两个存储过程中访问视图?这将降低两个过程的复杂性(但将其移至视图)。

    根据查询的结构,您甚至可以创建一个索引视图,该视图将创建数据的持久形式并允许您使用索引。

    【讨论】:

    • 当最终用户可以在任何时间段内运行它时,它会如何工作?
    • 您必须在视图中包含您需要过滤的所有列。因此,如果您过滤了开始或结束日期,则需要从填充视图的 where 子句中删除它,并将其包含在存储的过程逻辑中。
    猜你喜欢
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 2013-03-08
    • 1970-01-01
    相关资源
    最近更新 更多