SQL 中的代码重用和模块化

Posted

技术标签:

【中文标题】SQL 中的代码重用和模块化【英文标题】:Code reuse and modularity in SQL 【发布时间】:2009-01-19 09:41:21 【问题描述】:

代码重用和模块化是 SQL 存储过程编程的好主意吗?

如果是这样,将这些功能添加到 SQL 存储过程代码库的最佳方法是什么?

我通常为常见且重复的任务创建标量值函数。我发现它不仅可以简化类似于现有程序的新程序的开发,而且还有助于进行错误跟踪和故障排除。

但由于性能问题,我尽量远离表值函数。

我的经验法则是,如果它是一个计算,并且在多个地方使用,那么我创建一个标量值函数。

【问题讨论】:

【参考方案1】:

您会发现在查询中使用函数对性能来说是一场灾难。这些函数成为优化器的黑匣子,因此您最终需要将函数调用重新编码到查询中,以使其在表中的行数达到大量行时快速运行。

处理常见计算的更好方法是将它们插入到带有触发器的新列中,或者插入/更新查询中。这样您就可以索引计算的值并直接使用它,而不是在每次需要时都计算出来。

【讨论】:

想指出,现在最好的方法是computed column marked persisted【参考方案2】:

在代码重用方面,Sql 并没有给您很大的灵活性。当涉及到不涉及修改表的计算或其他任务时,我通常会创建函数。但是所有涉及写入表的任务以及我通常使用存储过程来更好地控制事务的那种事情。

【讨论】:

【参考方案3】:

您可以将代码分解为单独的存储过程,以帮助将复杂的存储过程分解为更易于管理的块。您也可以这样做来打破在函数中不起作用的常见逻辑。把它想象成类似于提取方法重构。

【讨论】:

将一个大的 sp 拆分成几个较小的 sp 的问题在于,它们只能嵌套到一层。 我不确定我是否理解。为什么只有一层? 不知道为什么,是SQL Server的限制。如果您自己调用的过程调用另一个数据过程,则不能执行到临时表中。【参考方案4】:

从应用程序端查看它的另一种方法是使用绑定来重用您的 SQL 查询。但这可能不是您想要的

【讨论】:

【参考方案5】:

为了跟进这件事,我确实遇到了一些性能问题,而且优化器似乎无法为函数内的代码选择正确的索引。

所以我必须使用索引提示(带关键字)指定正确的索引,以解决性能问题。

【讨论】:

以上是关于SQL 中的代码重用和模块化的主要内容,如果未能解决你的问题,请参考以下文章

第八章 读书笔记

Angular 2 - 多个模块中的管道重用 - 未找到错误或重复定义

为啥我的链表代码在模块化可重用 JavaScript 函数中不起作用?

跨测试重用 Jest 模块模拟

第八章 让开发板发出声音:蜂鸣器驱动

Angular 可重用模块和组件