是......好/坏/好......在存储过程中使用IF / While条件?

时间:2010-01-25 09:03:41

标签: sql-server-2005 performance stored-procedures

我主要关注的是SQL Server 2005 ...我浏览了很多网站,每个网站都有不同之处。

什么样的好/可以使用的场景..例如,甚至在IF中设置变量值或者仅当我运行查询时才会受到伤害。假设我的SP正在构建基于输入参数中的几个条件的动态SQL,我是否需要重新考虑查询...如何根据表中是否存在某些记录来运行不同的查询。等等.. 我的问题不仅限于这些场景......我正在寻找一个更广泛的答案,以便我可以改进我未来的SP

在本质上......在分支条件/循环中使用哪些语句很好,这很糟糕,哪些是好的。

3 个答案:

答案 0 :(得分:5)

通常......避免在数据库中使用过程代码,并坚持查询。这为查询优化器提供了更好地完成工作的机会。

例外是设计用于执行许多操作的代码,而不是创建结果集,以及当查询需要以指数方式连接行以获得结果时。

答案 1 :(得分:1)

如果您不提供任何代码,则很难回答这个问题。没有语言结构本身是好/坏/好,它想要实现的目标以及用这些结构表达的程度。

答案 2 :(得分:0)

没有确定的答案,因为它实际上取决于具体情况。

一般来说,我认为最好将逻辑保持在尽可能简单且基于集合的情况下。例如,使用多个嵌套IF条件使其过于复杂可能会使查询优化器复杂化,这意味着它无法创建适合于通过sproc的所有路径的良好执行计划。例如,第一次运行sproc时,它通过逻辑路径A,执行计划反映了这一点。下次使用不同的参数运行时,它会通过路径B但重新使用原始执行计划,这对于第二个路径不是最佳的。对此的一个解决方案是将负载分解为单独的存储过程以根据所遵循的路径进行调用 - 这样可以优化子sproc并独立缓存执行计划。

循环可能是唯一可行的选择,但总的来说我会尝试不使用它们 - 如果可能的话,总是尝试以基于集合的方式做事。