代码之家  ›  专栏  ›  技术社区  ›  Miles D

SQL Server函数中大型if子句的性能改进

  •  2
  • Miles D  · 技术社区  · 15 年前

    我在SQLServer2005中维护了一个函数,它基于一个整数输入参数需要调用不同的函数,例如。

    IF @rule_id = 1
       -- execute function 1
    ELSE IF @rule_id = 2
       -- execute function 2
    ELSE IF @rule_id = 3
       ... etc
    

    问题是有相当多的规则(大约100条),尽管上面的规则可读性很好,但它的性能并不好。目前,它被实现为一系列的if's,它执行二进制的CHOP,速度快得多,但是读和维护起来会变得相当不愉快。对于性能良好且相当可维护的东西,还有其他的想法吗?

    3 回复  |  直到 15 年前
        1
  •  3
  •   Remus Rusanu    15 年前

    我建议您通过编程生成代码,例如通过XML+XSLT。得到的T-SQL将与您现在的T-SQL相同,但是维护它将更加容易(添加/删除函数)。

    里面 功能 您没有太多选择,使用IFS几乎是唯一的解决方案。不能在函数中执行动态SQL(不能调用exec)。如果它是 存储过程 ,然后您就可以更自由地使用动态SQL,并使用类似查找表的技巧: select @function = function from table where rule_id = @rule_id; exec sp_executesql @function; .

        2
  •  2
  •   Russell Steen    15 年前

    你能改变它使它以字符串的形式执行函数吗?我通常建议您不要使用这种动态SQL,如果您后退一步,看看总体设计,可能会有更好的方法……但是,有了这里所知道的,当情况好转时,你可能会发现其中一个罕见的例外。

    前任:

    set @functionCall = 'functionRootName' + @rule_id
    exec @functionCall
    
        3
  •  0
  •   Jeff Meatball Yang    15 年前

    无论调用SQL函数是什么,它为什么不选择该函数?

    这似乎是一种选择不当的责任分配。