楼主: wisdomone1

[精华] 在web网站中大量采用存储过程性能讨论

[复制链接]
论坛徽章:
4
2010新春纪念徽章
日期:2010-03-01 11:07:22ITPUB9周年纪念徽章
日期:2010-10-08 09:28:52ITPUB十周年纪念徽章
日期:2011-11-01 16:24:51优秀写手
日期:2014-07-04 06:00:11
61#
发表于 2010-7-1 10:11 | 只看该作者
关注!

使用道具 举报

回复
论坛徽章:
69
生肖徽章2007版:羊
日期:2008-11-14 14:42:19复活蛋
日期:2011-08-06 08:59:05ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主4段
日期:2012-05-15 15:24:11
62#
发表于 2010-7-1 10:20 | 只看该作者
什么最熟就用什么好了.

使用道具 举报

回复
论坛徽章:
113
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:42:50现任管理团队成员
日期:2011-05-07 01:45:08ITPUB官方微博粉丝徽章
日期:2011-06-28 19:45:36蛋疼蛋
日期:2011-07-24 22:25:332012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25
63#
发表于 2010-7-1 11:25 | 只看该作者
精彩的讨论!
其实,高并发,或者典型的OLTP的网站,后端数据库很容易成为瓶颈。
其实,对于我们来说,跟taobao也有点像,一般需要排序的SQL都不被允许。

使用道具 举报

回复
论坛徽章:
33
阿斯顿马丁
日期:2014-02-07 14:09:26现代
日期:2014-02-15 13:45:272014年新春福章
日期:2014-02-18 16:43:09马上有钱
日期:2014-02-18 16:43:092014年世界杯参赛球队:喀麦隆
日期:2014-06-16 08:24:34itpub13周年纪念徽章
日期:2014-10-08 15:13:38
64#
发表于 2010-7-1 11:36 | 只看该作者
简单的sql操作肯定是不必写到存储过程里的。

假设你有1000张表,仅仅是基本的CRUD操作,都写成存储过程就有4000个,那好,我全都封到包里,那也有1000个包。

再来看单表的操作,C,D操作一般有一个,R,U就不好说了,可能A业务select的时候用10个字段,B业务用5个,C业务用3个,每个都写一个存储过程?同理,A业务更新10个字段,B业务更新5个,C业务更新3个,这样一来,单是针对一个表的CRUD存储过程就有可能超过10个。

好,我打个8折,1000张表,8000个CRUD的存储过程。和你真正处理业务逻辑的存储过程搁在一块儿,光找就得半天。

再者,一个表10个字段,写成存储过程,10个字段都作为参数?这样下来接口是很大的,在前台写sql,反正也要把这些内容都准备好的,通过存储过程,无疑把前后台的耦合度加大了。

sql注入的问题,sql注入是在哪里注入的?前台,那就要在前台控制住,后台数据库管这么宽干嘛?

使用道具 举报

回复
论坛徽章:
1
会员2007贡献徽章
日期:2007-09-26 18:42:10
65#
发表于 2010-7-1 16:38 | 只看该作者
如果开发人员对存储过程还熟悉,那就用存储过程。
谁说的存储过程效率低?ibm的一些产品基于oracle的就是大量用存储过程,在银行用的好好的,每天数据量非常大

使用道具 举报

回复
论坛徽章:
20
授权会员
日期:2005-11-02 13:35:57ITPUB8周年纪念徽章
日期:2009-09-27 10:21:22祖国60周年纪念徽章
日期:2009-10-09 08:28:00生肖徽章2007版:兔
日期:2009-11-13 10:54:06生肖徽章2007版:蛇
日期:2009-11-28 18:44:592010新春纪念徽章
日期:2010-01-04 08:33:082010新春纪念徽章
日期:2010-03-01 11:06:292010年世界杯参赛球队:瑞士
日期:2010-04-03 20:50:32ITPUB9周年纪念徽章
日期:2010-10-08 09:31:212009日食纪念
日期:2009-07-22 09:30:00
66#
发表于 2010-7-1 22:39 | 只看该作者
这时候,批量绑定就蹦出来了,FORALL循环也蹦出来了


原帖由 fan0124 于 2010-6-29 10:51 发表
在Oracle中,存储过程就是PL/SQL的模块

PL/SQL引擎会执行过程化语句,但它把SQL语句传送给SQL引擎处理,然后SQL引擎把处理的结果返回给PL/SQL引擎。

然后SQL引擎把处理的结果返回给PL/SQL引擎。

PL/SQL和SQL引擎间的频繁切换会大大降低效率。

使用道具 举报

回复
论坛徽章:
20
授权会员
日期:2005-11-02 13:35:57ITPUB8周年纪念徽章
日期:2009-09-27 10:21:22祖国60周年纪念徽章
日期:2009-10-09 08:28:00生肖徽章2007版:兔
日期:2009-11-13 10:54:06生肖徽章2007版:蛇
日期:2009-11-28 18:44:592010新春纪念徽章
日期:2010-01-04 08:33:082010新春纪念徽章
日期:2010-03-01 11:06:292010年世界杯参赛球队:瑞士
日期:2010-04-03 20:50:32ITPUB9周年纪念徽章
日期:2010-10-08 09:31:212009日食纪念
日期:2009-07-22 09:30:00
67#
发表于 2010-7-1 22:47 | 只看该作者
1、如果你的系统没有十分的繁忙,用存储过程简单,改个BUG、优化个SQL,只要数据库上面把存储过程改了编译一下就好了,不用几十台的APP SERVER去上线
2、如果系统很繁忙(指这个存储过程很忙),那可能你连编译它的机会都没有,一编译整个库就HANG在那里了,那绝对是灾难,这时候上线就要求你把前台业务全部停下来。而用APP端来实现的话,你就可以一台台的上线,业务总体来说不中断
3、数据库的CPU资源、IO资源非常昂贵,而且数据库又容易成为瓶颈还不容易扩展。所以量大的时候,放到APP好扩展

使用道具 举报

回复
论坛徽章:
0
68#
发表于 2010-7-1 23:07 | 只看该作者
学习了

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
69#
发表于 2010-7-2 00:48 | 只看该作者
原帖由 fan0124 于 2010-6-29 10:51 发表
在Oracle中,存储过程就是PL/SQL的模块

PL/SQL引擎会执行过程化语句,但它把SQL语句传送给SQL引擎处理,然后SQL引擎把处理的结果返回给PL/SQL引擎。

然后SQL引擎把处理的结果返回给PL/SQL引擎。

PL/SQL和SQL引擎间的频繁切换会大大降低效率。


其他语言就没有切换了?PLSQL至少和SQL是在同一台机器上!


原帖由 yueyangflash 于 2010-6-29 13:23 发表
将业务放到数据库中去实现  后期维护可能会存在很大的问题!

放到数据库外实现为什么就没问题?

原帖由 yueyangflash 于 2010-6-29 13:23 发表
程序员看到存储过程可能并不知道这个存储过程是干什么用的!

那我看到一段JAVA也是一头雾水!


原帖由 dingjun123 于 2010-6-29 14:48 发表

全用存储过程可能会带来的问题比大部分用SQL带来的问题多。除非你们的团队存储过程和性能优化特别猛!~ 因为很多人熟悉SQL,但是不熟悉PLSQL,为什么放弃熟悉的而且很好的东西,去用不熟悉的东西呢?当然可能会用到存储过程的,但是绝对不是全部!~


全用存储过程问题多在哪里?


原帖由 wolfop 于 2010-6-29 14:50 发表
从应用分层的原则,大量使用存储过程导致业务逻辑分散在DB和应用服务器层,肯定不好开发维护和更新。
从性能来说,SP肯定不是最优的,我知道的案例就有某运营商原来计费批价都用SP,后来很难满足性能的问题。
总体来说,SP可以用,但要很慎重,最好只用来维护,不用于业务逻辑和支撑高并发高性能的东西。


分层也可以分到DB里面。"SP肯定不是最优的", 举个实例看看?有可能是你的SP没写好。


原帖由 fan0124 于 2010-6-29 15:19 发表
关于存储过程,首先带来的问题就是业务变动,然后数据库扩展,业务扩展

你怎么弄,扩展十几个数据库时,你去把存储过程迁移十几次去?那不把你搞死

如果业务逻辑变化的时候,怎么弄,改存储过程只有

然后就是在并发比较高的OLTP,性能是很差的

还有对测试人员来说,调试时,你还要他专门跑到数据库里去调试存储过程?如果是SQL,他直接跟踪调试就可以了


“存储过程迁移”?数据才有迁移。如果你是说把程序复制到各个库,不用存储过程难道就不用复制了?应用服务器上也得有程序吧!

“如果业务逻辑变化的时候,怎么弄,改存储过程只有”改就改呗,难道放到外面就不用改。

“然后就是在并发比较高的OLTP,性能是很差的”举个实例。

存储过程的调试并不比其他语言更困难。

原帖由 wisdomone1 于 2010-6-29 17:23 发表
各显神通哟,不了解开发,上司就是让用存储过程,我又找不到合适或强有力的说词,唉;不懂开发,没法对比应用与oracle实现业务逻辑的优差性,唉!

列举一个我们的存储过程 ,大体对于每个表皆有select,update,delete,insert对应的存储过程,

--E_TeacherLoginInfo包声明
CREATE OR REPLACE PACKAGE PKG_E_TEACHERLOGININFO
AS

/

你这个只是TABLE层面的API, 就是所谓的TAPI, 好的做法是TOM提倡的XAPI, 即事务级别的API. 事务里面可能有多个SQL, 直接写就是,不必再弄一层表级的API.


原帖由 fan0124 于 2010-6-30 11:49 发表
不是说要你一定就像淘宝那样去做

第一,你所在的团队的技术积累是没有达到人家那样的高度很深度的

第二,开发团队能够达到用复杂算法及良好的架构来处理很多复杂运行,性能问题吗(比如说实现复杂的在线分析统计),还没有到那个程度,就只

能让DB去处理

第三,最关键的,你的数据量和并发能达到淘宝那么高吗?没有那么高(楼主的系统实时级别,数据量级别应该不大吧,我可以肯定的说)

能用DB抗的住,那你就用DB抗,但是抗不住了,就要考虑在APP应用上扩展

为什么APP扩展容易,一台机器一部署就好了。但是数据库是要复杂多的

第四,建议还是业务逻辑往应用上放


应用服务器不是最后也要访问DB? 一个事务如果用到10个SQL, 放到应用服务器也是一样,一个都跑不了,最终压力还是会落到DB.

原帖由 horizon 于 2010-6-30 14:23 发表
用存储过程移植会出现大问题,可能要重写存储过程也说不定
但应用程序改动会少

如果你说的是换数据库,趁早打消这个念头,不管怎么做都是很困难的。TOM的书专门有一节讲到为什么独立于数据库的想法是不现实的。
PLSQL实际上更为“通用”,在任何操作系统的ORACLE都一样运行;所有的开发语言都可调用存储过程。


原帖由 dahuzizyd 于 2010-7-1 11:36 发表
简单的sql操作肯定是不必写到存储过程里的。

假设你有1000张表,仅仅是基本的CRUD操作,都写成存储过程就有4000个,那好,我全都封到包里,那也有1000个包。

再来看单表的操作,C,D操作一般有一个,R,U就不好说了,可能A业务select的时候用10个字段,B业务用5个,C业务用3个,每个都写一个存储过程?同理,A业务更新10个字段,B业务更新5个,C业务更新3个,这样一来,单是针对一个表的CRUD存储过程就有可能超过10个。

好,我打个8折,1000张表,8000个CRUD的存储过程。和你真正处理业务逻辑的存储过程搁在一块儿,光找就得半天。

再者,一个表10个字段,写成存储过程,10个字段都作为参数?这样下来接口是很大的,在前台写sql,反正也要把这些内容都准备好的,通过存储过程,无疑把前后台的耦合度加大了。

sql注入的问题,sql注入是在哪里注入的?前台,那就要在前台控制住,后台数据库管这么宽干嘛?

把所有CRUD都做成存储过程不是办法;存储过程应该以事务为单位。
参数也可以用OBJECT来传递,类似PLSQL的记录类型。
如果你的应用服务器被攻击了,别人可以上传脚本做DML那就很危险。把表的权限都收回,只留下存储过程接口相当安全一些。


原帖由 zhang41082 于 2010-7-1 22:47 发表
1、如果你的系统没有十分的繁忙,用存储过程简单,改个BUG、优化个SQL,只要数据库上面把存储过程改了编译一下就好了,不用几十台的APP SERVER去上线
2、如果系统很繁忙(指这个存储过程很忙),那可能你连编译它的机会都没有,一编译整个库就HANG在那里了,那绝对是灾难,这时候上线就要求你把前台业务全部停下来。而用APP端来实现的话,你就可以一台台的上线,业务总体来说不中断
3、数据库的CPU资源、IO资源非常昂贵,而且数据库又容易成为瓶颈还不容易扩展。所以量大的时候,放到APP好扩展

如果你允许新旧版本程序一起跑,才有可能把APP逐个更新。

使用道具 举报

回复
论坛徽章:
36
数据库板块每日发贴之星
日期:2008-06-23 01:01:58奥运会纪念徽章:足球
日期:2012-08-21 19:26:212013年新春福章
日期:2013-02-25 14:51:24蜘蛛蛋
日期:2013-05-03 17:38:25一汽
日期:2013-08-19 16:12:56保时捷
日期:2013-10-18 23:41:21阿斯顿马丁
日期:2013-11-11 14:17:47大众
日期:2013-11-17 16:50:19问答徽章
日期:2014-01-13 00:25:10马上有车
日期:2014-08-03 11:06:20
70#
 楼主| 发表于 2010-7-2 09:07 | 只看该作者
相当不错,谢谢大家,谢谢newkid大牛的精彩分析!顶起来!!!

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表