京公网安备 11010802034615号
经营许可证编号:京B2-20210330
【每周一期-数据蒋堂】存储过程的利之弊
存储过程是数据库领域中应用非常广泛的技术,关于它的利弊讨论由来已久,我们这里针对存储过程的两个公认度较高的优点进行剖析,从而更清楚存储过程的潜在风险及应用场景。
存储过程利于界面与逻辑分离!
界面与逻辑分离是现代应用开发的一个基本准则。相对于后台数据处理逻辑,界面会有更多样性的环境,如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数据分析师 出品 作者:李诗怡 1. 事实表 vs 维度表 对比维度 事实表 维度表 核心问题 记录“业务发生了什么事” 描述 ...
2026-10-02做数据聚合时,PySpark的groupBy()确实能完成统计,这也是它的本职工作。但它有一个根本性局限:每一组数据,最终只能返回一行 ...
2026-10-01热力地图是数据可视化中极具辨识度与实用性的空间分析图表,结合地理空间维度与数据密度特征,通过颜色深浅、色阶渐变直观展示数 ...
2026-09-30 很多数据分析师做过按月份的销售额趋势图,画过按天的流量折线图,但当被问到“时间序列和普通数据有什么本质区别”“季节性 ...
2026-09-30同样是“银行数据岗”,在国有大行总行数据中心、在一家城商行的零售部、在银行系金融科技子公司、在保险公司,工作内容、成长节 ...
2026-09-29在数据分析与统计学研究中,数据往往不是独立存在的,不同变量之间普遍存在相互关联、相互影响的关系。相关性统计分析是挖掘变量 ...
2026-09-29 导读:大多数人只把 dataclasses 当成偷懒工具,用来少写 __init__、__repr__ 这类魔法方法。但它的能力远不止于此。本文带 ...
2026-09-29 很多数据分析师能熟练地计算指标、搭建标签体系,但当被问到“画像到底在解决什么问题”“画像和标签是什么关系”“画像如何 ...
2026-09-29在MySQL数据库运维与业务开发中,行业普遍存在“数据达到千万级就必须分表”的说法。但在实际生产环境中,千万条数据并不是强制 ...
2026-09-28CDA数据分析师 出品 作者:李诗怡 1. 5W1H 分析法 定义:经典系统性思维框架,通过六个核心维度对问题进行全方位拆解与剖析,确 ...
2026-09-28 很多分析师在设计标签时思路清晰,但真到落地环节却面临“数据在手,不知如何转化为可用标签”的困境:或因加工方式选择不当 ...
2026-09-28CDA数据分析师 出品 作者:李诗怡 1. 用户标签体系 定义: 通过一系列高度精炼的特征标识,对用户属性、行为与偏好进行量化刻画 ...
2026-09-24Pandas是Python生态中用于表格数据处理的核心库,广泛应用于数据清洗、统计运算、报表输出、数据分析建模等场景。在处理极大数值 ...
2026-09-24随着数字经济快速发展,数据已成为核心生产要素,各行各业的业务沉淀、用户行为、设备运行、市场交易均产生海量数据。数据处理作 ...
2026-09-24 很多分析师每天和数据打交道,但当被问到“标签是什么”“标签和指标有什么区别”“标签体系如何设计”时,却常常答不上来。 ...
2026-09-24在时序数据分析中,大部分业务数据并非持续平稳变化,而是会在某些时间节点出现突然抬升、断崖下跌、趋势反转、波动异变等现象, ...
2026-09-23在统计学与数据分析中,研究多组数据差异最常用的方法为单因素方差分析与事后多重比较。很多数据分析初学者容易混淆两者功能,认 ...
2026-09-23 很多数据分析师每天都在写 SQL,但当被问到“DQL 的本质是什么”“SELECT 子句的书写顺序与执行顺序为何不同”“INNER JOIN ...
2026-09-23 很多数据分析师写过无数个SELECT查询,但当被问到“如何新建一张表来固化中间数据”“创建视图和创建物理表有什么区别”“视 ...
2026-09-22CDA数据分析师 出品 作者:李诗怡 1. 金字塔原理 定义: 一种“先总后分、先结论后原因”的思考和表达方式。顶层为核心观点,中 ...
2026-09-22