【问题标题】:Calling Procedure from a Procedure从过程调用过程
【发布时间】:2014-06-10 18:10:29
【问题描述】:

我有一个执行大量解析和插入的存储过程。它针对特定表中的每一行从前端触发。

为了模块化和可读性,我的任务是更改过程,以便在一个存储过程中进行解析并插入到另一个存储过程中。

现在陷入两难境地,我认为最好的方法是拆分存储过程并从原始存储过程中调用不同的存储过程。通过这样做,更改代码所需的时间非常少,但我关心的是对数据库的调用次数。

如果有 N 行,那么之前调用数据库的次数是 N。但是现在基于新方法,调用次数将是 2*N。

另一种方法是将所有表数据写入临时表,然后做必要的事情。这种方式减少了对数据库的调用,但它给ids 带来了另一个问题。改变可能需要几个小时才能完成。

我的问题是,如果我保留原来的逻辑并将它们拆分成多个存储过程,它对性能的影响会有多大?

前端的行数通常不会超过 100。

谢谢。

【问题讨论】:

  • “模块化和可读性”是导致性能下降的必然方式,至少在 T-SQL 中是这样。
  • 如果由我来决定,我会保持原样,因为它可以在几秒钟内完成工作,但这是必须完成的。

标签: sql sql-server stored-procedures


【解决方案1】:

就像我在评论中所说的那样,它会影响性能;没有代码很难准确判断多少。

如果你真的需要重构它,试着将一些代码提取到内联表值函数中。不是多语句 TVF,不是标量 TVF,不是存储过程,而是内联 TVF。

原因是优化器会将内联 TVF 视为视图,并将其合并并与外部查询一起优化,因此它有相当大的机会被正确优化。

【讨论】:

  • 嗯不是我想的方法。临时表或中间表不会比使用内联 TVF 更好吗?
  • 可能不会,至少不是您考虑的方法。但是请发布一些代码,以便我们可以平等地讨论它。
  • 代码量有点大,没有前端代码没用。无论如何,我会研究 TVF 方法。谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多