
【每周一期-数据蒋堂】存储过程的利之弊
存储过程是数据库领域中应用非常广泛的技术,关于它的利弊讨论由来已久,我们这里针对存储过程的两个公认度较高的优点进行剖析,从而更清楚存储过程的潜在风险及应用场景。
存储过程利于界面与逻辑分离!
界面与逻辑分离是现代应用开发的一个基本准则。相对于后台数据处理逻辑,界面会有更多样性的环境,如PC、手机等,而且业务稳定性也不强,经常会改。如果能把两者分离,开发和维护界面时绑着数据处理逻辑一起改,成本就低很多。
支持存储过程的观点认为,使用存储过程能实现界面与逻辑分离。存储过程在后台数据库中运算,只要向前端提供数据,而不必关心界面的形式和异动。把所有的数据处理逻辑都写成存储过程,还有利于统一数据的出入口,易于实现数据权限管控。
但是,仔细想想会发现,实现界面与逻辑分离并不是存储过程的专利。只要做一个数据访问层,所有数据的进出都通过这个访问层,也会有同样效果,事实上也确实有些应用是这么做的,但并不普遍。这是什么原因呢?这样的数据访问层和采用存储过程有什么区别呢?
差别在于开发复杂度上。
数据处理逻辑会经常涉及到批量结构化数据的处理,而数据库之外的程序设计语言在这方面能力都很弱,用Java写个数据求和都要很多行,更不要说过滤、分组之类的运算了。而存储过程的基本部件是SQL,这方面支持得很好,虽然存储过程也有开发调试困难的毛病,但大多数情况下用于编写复杂的数据处理逻辑还是要比高级语言更容易。
换句话说,存储过程确实利于界面与逻辑分离,不过存储过程实现后台数据逻辑的优势是SQL的集合运算能力支撑的。它主要来自于开发便捷,而不是应用结构。
有些场合无法利用存储过程的计算能力,就只能实现库外的数据访问层了。比如数据来源涉及多数据库或非数据库的情况。
存储过程利于界面与逻辑分离?
界面与逻辑分离的准则还有两面性,它并没有明确定义什么程序算是界面,更没有说界面环节就不再有数据计算任务。
一个典型的任务就是报表。报表要在界面中呈现,其业务稳定性也较弱,经常增改,很显然属于界面环节的事务。但是,报表经常却有复杂的数据源计算过程,如果把这部分计算也作为后台逻辑强行放进存储过程中,则不仅不会获得界面与逻辑分离的好处,反而带来巨大的麻烦,这与网上许多推荐将复杂报表的计算过程中采用存储过程的观点正好相反。
报表的呈现模板一般是由报表工具绘制的,以文件形式存放在应用中,如果数据源计算由存储过程完成,则这两个紧密相关的部分在物理上分别存放在两处,要修改一张报表时需要两个部分需要同步调整,不仅容易遗漏出错,还可能增加沟通成本(两部分的负责人员可能不同)。共享数据库中的存储过程还可能被其它报表甚至其它应用调用,修改时就可能造成其它模块的不正常。用存储过程实现报表数据源会破坏应用的模块结构,增大应用的耦合度,造成维护成本升高。
采用存储过程还会造成安全性和高效率的矛盾。原则上开发报表只需要对数据库有只读权限,但如果数据源是存储过程开发的,则需要向报表开发人员开放编译和运行存储过程的权限,这几乎可以对数据库做一切操作了,安全隐患非常大。一个办法是加强管理,所有上载的存储过程都需要多人审核把关,但这势必会导致低效率,本来报表开发人员自己就能完成的事情要涉及更多岗位。
如果有不依赖于数据库的便捷计算能力,则可以避免掉存储过程的这些劣势。把业务稳定性不强、与界面相关紧密的计算移到数据库外,和应用程序集成到一起,维护成本更低。即使业务稳定性强的计算逻辑也可以用库外计算实现,解决多数据库、非数据库等多样性数据源的问题。不采用存储过程的整体应用结构更为合理。
存储过程有更好的数据计算性能?
实际测试表明,用存储过程实现数据计算,常常比用SQL取出数据后在外部计算的性能更好。存储过程快在哪里了?
网上有观点说,因为存储过程是预编译的,而每次执行SQL时要临时编译,所以存储过程会更快。其实编译SQL的那点时间相对于数据计算而言可以忽略不计,以不同参数反复执行的SQL也可以预先准备,只要编译一次。有些程序员把不同参数拼进SQL,每次向数据库发送不同SQL,编译时间就不可忽略了。
存储过程的快,主要在于数据不出库。外部程序访问库内数据时必须通过数据库提供的接口,而这些接口的性能大都不好,特别是面向Java程序的JDBC接口。每次发出SQL让数据库执行都会调用这个接口,速度就上不去。如果应用程序和数据库不在同一台物理机器上时,还会有一些网络延迟,不过和接口的低性能相比并不算严重。在外部计算时,从数据库获取数据的时间常常会超过计算本身的时间。
存储过程本身的执行性能并不好。我们针对某著名商用数据库进行过测试:一句SQL可以完成的运算(比如对某个大表的字段求和),如果改用存储过程把数据一行行取出来计算,差不多会慢出一个数量级。用Java等语言从文件系统中读数做同样的计算,也会比存储过程快很多;外部计算相对容易写出并行代码,充分利用现代服务器多CPU的优势,存储过程一般都没有这个机制了。而且,如果把很多计算都放到存储过程中,并发运算时会加重数据库的负担,使本来就不快的存储过程更慢。
存储过程的性能更好,与其说是优势,倒不如说是被低效的数据库访问接口绑架所致。
目前业内还只有关系数据库有较好的交易一致性能力,适合充当OLTP业务的后台,这样从前端采集到的数据会直接进入关系数据库,这导致原始数据大量存储于数据库中。如果要对这些数据进行计算,采用外部计算方案时,取出数据太慢,总体性能就会很差;而使用存储过程,虽然计算本身不快,但数据不出库也会获得较好性能。这是存储过程不能被完全替代的主要原因和场景。
蒋步星,清华大学计算机硕士,著有《非线性报表模型原理》等
1989年中国国际奥林匹克数学竞赛团体冠军成员,个人金牌。
2000年创立润乾公司,首次在润乾报表中提出非线性报表模型,完美解决了中国式复杂报表制表难题,目前该模型已经成为报表行业的标准。
2008年开始研发不依赖关系型数据的计算引擎,历经多个版本后,于2014年集算器正式发布。有效地提高了复杂结构化大数据计算的开发速度和运算效率。
2016年荣获中国电子信息产业发展研究院评选的“2016年中国软件和信息服务业 • 十大领军人物”。
2017年将带领润乾软件朝着拥有自主产权的非关系型强计算数据仓库、云数据库等产品迈进。
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
CDA 数据分析师视角:从数据迷雾中探寻商业真相 在数字化浪潮席卷全球的今天,数据已成为企业决策的核心驱动力,CDA(Certifie ...
2025-07-04CDA 数据分析师:开启数据职业发展新征程 在数据成为核心生产要素的今天,数据分析师的职业价值愈发凸显。CDA(Certified D ...
2025-07-03从招聘要求看数据分析师的能力素养与职业发展 在数字化浪潮席卷全球的当下,数据已成为企业的核心资产,数据分析师岗位也随 ...
2025-07-03Power BI 中如何控制过滤器选择项目数并在超限时报错 引言 在使用 Power BI 进行数据可视化和分析的过程中,对过滤器的有 ...
2025-07-03把握 CDA 考试时间,开启数据分析职业之路 在数字化转型的时代浪潮下,数据已成为企业决策的核心驱动力。CDA(Certified Da ...
2025-07-02CDA 证书:银行招聘中的 “黄金通行证” 在金融科技飞速发展的当下,银行正加速向数字化、智能化转型,海量数据成为银行精准 ...
2025-07-02探索最优回归方程:数据背后的精准预测密码 在数据分析和统计学的广阔领域中,回归分析是揭示变量之间关系的重要工具,而回 ...
2025-07-02CDA 数据分析师报考条件全解析:开启数据洞察之旅 在当今数字化浪潮席卷全球的时代,数据已成为企业乃至整个社会发展的核心驱 ...
2025-07-01深入解析 SQL 中 CASE 语句条件的执行顺序 在 SQL 编程领域,CASE语句是实现条件逻辑判断、数据转换与分类的重要工 ...
2025-07-01SPSS 中计算三个变量交集的详细指南 在数据分析领域,挖掘变量之间的潜在关系是获取有价值信息的关键步骤。当我们需要探究 ...
2025-07-01CDA 数据分析师:就业前景广阔的新兴职业 在当今数字化时代,数据已成为企业和组织决策的重要依据。数据分析师作为负责收集 ...
2025-06-30探秘卷积层:为何一个卷积层需要两个卷积核 在深度学习的世界里,卷积神经网络(CNN)凭借其强大的特征提取能力 ...
2025-06-30探索 CDA 数据分析师在线课程:开启数据洞察之旅 在数字化浪潮席卷全球的当下,数据已成为企业决策、创新与发展的核心驱 ...
2025-06-303D VLA新范式!CVPR冠军方案BridgeVLA,真机性能提升32% 编辑:LRST 【新智元导读】中科院自动化所提出BridgeVLA模型,通过将 ...
2025-06-30LSTM 为何会产生误差?深入剖析其背后的原因 在深度学习领域,LSTM(Long Short-Term Memory)网络凭借其独特的记忆单元设 ...
2025-06-27LLM进入拖拽时代!只靠Prompt几秒定制大模型,效率飙升12000倍 【新智元导读】最近,来自NUS、UT Austin等机构的研究人员创新 ...
2025-06-27探秘 z-score:数据分析中的标准化利器 在数据的海洋中,面对形态各异、尺度不同的数据,如何找到一个通用的标准来衡量数据 ...
2025-06-26Excel 中为不同柱形设置独立背景(按数据分区)的方法详解 在数据分析与可视化呈现过程中,Excel 柱形图是展示数据的常用工 ...
2025-06-26CDA 数据分析师会被 AI 取代吗? 在当今数字化时代,数据的重要性日益凸显,数据分析师成为了众多企业不可或缺的角色 ...
2025-06-26CDA 数据分析师证书考取全攻略 在数字化浪潮汹涌的当下,数据已成为企业乃至整个社会发展的核心驱动力。数据分析师作 ...
2025-06-25