【发布时间】:2009-01-19 09:41:21
【问题描述】:
代码重用和模块化是 SQL 存储过程编程的好主意吗?
如果是这样,将这些功能添加到 SQL 存储过程代码库的最佳方法是什么?
我通常为常见且重复的任务创建标量值函数。我发现它不仅可以简化类似于现有程序的新程序的开发,而且还有助于进行错误跟踪和故障排除。
但由于性能问题,我尽量远离表值函数。
我的经验法则是,如果它是一个计算,并且在多个地方使用,那么我创建一个标量值函数。
【问题讨论】:
标签: sql sql-server
代码重用和模块化是 SQL 存储过程编程的好主意吗?
如果是这样,将这些功能添加到 SQL 存储过程代码库的最佳方法是什么?
我通常为常见且重复的任务创建标量值函数。我发现它不仅可以简化类似于现有程序的新程序的开发,而且还有助于进行错误跟踪和故障排除。
但由于性能问题,我尽量远离表值函数。
我的经验法则是,如果它是一个计算,并且在多个地方使用,那么我创建一个标量值函数。
【问题讨论】:
标签: sql sql-server
您会发现在查询中使用函数对性能来说是一场灾难。这些函数成为优化器的黑匣子,因此您最终需要将函数调用重新编码到查询中,以使其在表中的行数达到大量行时快速运行。
处理常见计算的更好方法是将它们插入到带有触发器的新列中,或者插入/更新查询中。这样您就可以索引计算的值并直接使用它,而不是在每次需要时都计算出来。
【讨论】:
在代码重用方面,Sql 并没有给您很大的灵活性。当涉及到不涉及修改表的计算或其他任务时,我通常会创建函数。但是所有涉及写入表的任务以及我通常使用存储过程来更好地控制事务的那种事情。
【讨论】:
您可以将代码分解为单独的存储过程,以帮助将复杂的存储过程分解为更易于管理的块。您也可以这样做来打破在函数中不起作用的常见逻辑。把它想象成类似于提取方法重构。
【讨论】:
从应用程序端查看它的另一种方法是使用绑定来重用您的 SQL 查询。但这可能不是您想要的
【讨论】:
为了跟进这件事,我确实遇到了一些性能问题,而且优化器似乎无法为函数内的代码选择正确的索引。
所以我必须使用索引提示(带关键字)指定正确的索引,以解决性能问题。
【讨论】: