对于SQL存储过程编程,代码重用和模块化是一个好主意吗?
如果是这样,将这些功能添加到SQL存储过程代码库的最佳方法是什么?
我通常会为常见且重复的任务创建标量值函数。我发现它既简化了与现有程序类似的新程序的开发,又在错误跟踪和故障排除方面提供了很多帮助。
由于性能问题,我试图远离表值函数。
我的经验法则是,如果它是一个计算,并且它在几个地方使用,那么我创建一个标量值函数。
答案 0 :(得分:5)
您将发现在查询中使用函数会对性能造成灾难。这些函数成为优化器的黑盒子,因此一旦你在表中占用大量行,你最终会将函数调用重新编码回查询中,以使其快速运行。
处理常见计算的更好方法是使用触发器或插入/更新查询将它们插入到新列中。这样,您可以对计算出的值进行索引并直接使用它,而不是在每次需要时将其计算出来。
答案 1 :(得分:2)
在代码重用方面,Sql并没有给你很大的灵活性。我通常在计算或其他不涉及修改表的任务时创建函数。但是所有涉及写入表的任务以及那些我通常使用存储过程来更好地控制事务的事情。
答案 2 :(得分:1)
您可以将代码分解为单独的存储过程,以帮助将复杂的存储过程分解为更易于管理的块。您也可以这样做,以打破在函数中不起作用的常见逻辑。可以认为它类似于Extract Method重构。
答案 3 :(得分:0)
从应用程序端查看它的另一种方法是使用绑定来重用SQL查询。但那可能不是你想要的
答案 4 :(得分:0)
为了跟进这一点,我遇到了一些性能问题,似乎优化器无法为函数内部的代码选择正确的索引。
所以我必须使用索引提示(带关键字)指定正确的索引,以解决性能问题。