知识卡片

存储过程/存储函数相比应用层处理的四项优势

普通读书笔记卡

内容

把复杂的数据处理逻辑放进存储过程/存储函数、在数据库服务器端执行, 相比在应用层用多条SQL语句拼接处理,优势不是单一维度的,而是四个 不同层面同时受益。性能上,存储过程首次定义后就被编译并常驻数据库 服务器,调用时省去了重复解析、编译的开销,而且处理直接在服务器端 完成,省掉了数据在客户端/应用服务器与数据库之间往返传输的成本。 分工上,复杂的数据处理逻辑由数据库管理员或数据库专业人员一次性 写好、封装成接口,应用程序员只需要调用,不需要自己拼装复杂SQL, 且只要接口(参数、返回值)不变,数据库端如何优化实现细节都不会 影响应用层代码——这本质上是[[实体完整性参照完整性用户自定义完整性 三层约束体系]]类似的关注点分离思路在编程层面的体现。负载与网络流量 上,应用端调用一次存储过程只需要发一条调用语句、收一个最终结果, 不需要把中间过程的每条SQL语句和中间结果都在网络上来回传递,减轻 了应用服务器和网络的压力。安全性上,存储过程把对数据的操作封装 起来,外部程序只能通过存储过程接口访问,不必直接被授权访问底层 数据表,缩小了误操作或越权访问的暴露面。这四项优势分别对应”谁受益” 的四个不同角色(服务器性能、程序员工作量、网络与负载、数据安全), 不是同一个优化点带来的连锁反应,而是四个独立的收益来源。

参考来源

- 位置:《数据库原理(微课版)》第8章《数据库编程》8.2节"存储过程和 存储函数"(源文件:_epub-src/index_split_005.html) - 结论依据:原文明确"当存储过程被成功定义后,会被编译、存储在数据库 服务器中……提高数据库服务器本身的数据处理效率""数据库管理员或 其他数据库专业人员对存储过程和存储函数的修改,只要保持接口不变 就不会影响到应用程序""只需发送一条调用语句,并接收最终处理结果 ……降低了网络传输量""避免外部程序过多使用数据、直接操作数据表, 从而降低了对外部程序的授权",因此可以推出四项独立的优势维度。 - 原始内容:当存储过程被成功定义后,会被编译、存储在数据库服务器中。 需要调用时可以直接执行,减少了解析、编译的过程……存储过程封装了 对数据库的操作,只允许外部程序调用存储过程或存储函数来完成操作。