参考其他文章列举存储过程的优劣,据此分析目前智慧电站总项目下,还有那些地方的数据库操作,适合使用存储过程进行优化。
存储过程是什么?
储存程序 (Stored Procedure),又可称预储程序或者存储过程,是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象,它可以视为数据库中的一种函数或子程序。——维基百科
可以理解为数据库中的函数过程。
存储过程的优势
就我在项目中实际使用来说,当前台处理涉及多条数据库查询语句操作,并出现临时表需整合多个表筛选多余信息的情况下使用到了存储过程。并且发现在数据库中写一个存储过程,web端、移动端以及桌面端都可以调用。
减少了服务器/客户端网络流量
过程中的命令作为代码的单个批处理执行。这可以显著减少服务器和客户端之间的网络流量,因为只有对执行过程的调用才会跨网络发送。 如果没有过程提供的代码封装,每个单独的代码行都不得不跨网络发送。
更强的安全性
- 多个用户和客户端程序可以通过过程对基础数据库对象执行操作,即使用户和程序对这些基础对象没有直接权限。 过程控制执行哪些进程和活动,并且保护基础数据库对象。 这消除在了单独的对象级别授予权限的要求,并且简化了安全层。
- 在通过网络调用过程时,只有对执行过程的调用是可见的。 因此,恶意用户无法看到表和数据库对象名称、嵌入自己的 Transact-SQL 语句或搜索关键数据。
- 使用过程参数有助于避免 SQL 注入攻击。 因为参数输入被视作文字值而非可执行代码,所以,攻击者将命令插入过程内的 Transact-SQL 语句并损害安全性将更为困难。
- 可以对过程进行加密,这有助于对源代码进行模糊处理。
代码的重复使用
任何重复的数据库操作的代码都非常适合于在过程中进行封装。这消除了不必要地重复编写相同的代码、降低了代码不一致性,并且允许拥有所需权限的任何用户或应用程序访问和执行代码。
更容易维护
在客户端应用程序调用过程并且将数据库操作保持在数据层中时,对于基础数据库中的任何更改,只有过程是必须更新的。 应用程序层保持独立,并且不必知道对数据库布局、关系或进程的任何更改的情况。
改进的性能
默认情况下,在首次执行过程时将编译过程,并且创建一个执行计划,供以后的执行重复使用。 因为查询处理器不必创建新计划,所以,它通常用更少的时间来处理过程。
存储过程的劣势
很多文章提到存储过程的可移植性差:
由于存储过程将应用程序绑定到 SQL Server,因此使用存储过程封装业务逻辑将限制应用程序的可移植性。如果应用程序的可移植性在您的环境中非常重要,则将业务逻辑封装在不特定于 RDBMS 的中间层中可能是一个更佳的选择。
但目前项目,是确认绑定在SQL Server数据库中,不会轻易更改,可移植性不是考虑的重点。
适用范围
依据存储过程的优势,目前可以封装成存储过程的几个数据处理:
- 订餐系统中的提交操作
【遇到问题】之前在做这一功能时,就受限于提交多个表增、删、改的顺序以及完成状态,利用php多次判断数据操作的执行状态的方式不仅繁琐,而且进行到其中一步发生错误,还需要把前面的数据操作撤销,不影响该次订餐操作性质。
【解决当时】封装为存储过程,利用数据库本身的逻辑控制,一次性提交执行一次订餐提交操作。