楼主: fan0124

[SQL] 【讨论】关于数据层用不用存储过程封装的问题?

[复制链接]
论坛徽章:
0
21#
发表于 2010-7-28 10:45 | 只看该作者
我們的ERP系統 邏輯全部用PLSQL寫的,新增刪除更改記錄也用SP實現 IFS

使用道具 举报

回复
论坛徽章:
3
奥运会纪念徽章:排球
日期:2008-10-24 13:30:01生肖徽章2007版:鼠
日期:2008-11-20 08:50:122009日食纪念
日期:2009-07-22 09:30:00
22#
发表于 2010-7-28 17:32 | 只看该作者
大项目里把SQL干到页面里完全不可行,维护成本太高了。
而且每个程序员的风格和水平不一样,那SQL写的五花八门的,维护起来会死人的。
一般的项目里(非银行和电信),通常情况下返回的结果集数量都不会很大。效率基本上不成问题,封装到过程里没啥大问题。

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
9
生肖徽章2007版:牛
日期:2009-03-10 21:26:492010新春纪念徽章
日期:2010-01-04 08:33:082010年世界杯参赛球队:葡萄牙
日期:2010-02-22 14:35:242010新春纪念徽章
日期:2010-03-01 11:19:092010广州亚运会纪念徽章:射击
日期:2010-09-08 23:42:12ITPUB9周年纪念徽章
日期:2010-10-08 09:31:212010广州亚运会纪念徽章:拳击
日期:2010-10-30 00:46:582011新春纪念徽章
日期:2011-02-18 11:43:322011新春纪念徽章
日期:2011-03-01 08:49:39
23#
发表于 2010-7-29 00:27 | 只看该作者
先不说性能和逻辑究竟应该放在应用层还是plsql过程中这两个问题,我先说说近日遇到的一个问题:

近日发现数据库的CPU占用很高,用AWR找出Top SQL然后开始调优,但是这条语句有一个
dbms_lob.instr( userid_list , userid )
开发商把userid串接成一个字符串放在userid_list里面,userid_list是clob类型读取时默认触发 direct path read,再查I/O发现磁盘每秒读取60~70 MB,修改存储属性,让clob也能缓存在内存中,但是该死dbms_lob.instr( userid_list , userid )导致了一张一万多行的表扫描4次,一万多行不多,问题是每行都起码有一个clob(8k),估计CPU就是在这里面耗完的。
联系开发商改应用,估计拖到猴年马月,自己改又没有源代码,建索引 dbms_lob.instr( userid_list , userid ) 怎么弄?其他涉及的字段选择性及其差,都是状态字段。
现在只能说俺们机器和存储比较好,硬撑这个SQL。

如果对外只是提供过程作为接口,那好办,方法多了,废掉这个表,把userid_list拆开按照范式做,建立相应的索引,用userid查,那根本就不是什么难调的SQL;不改表,在这个表加触发器,增删改都修改另一个范式的 userids 表,再改SQL把dbms_lob.instr( userid_list , userid ) 改成搜索遵守范式的表;再不行,上全文索引,把dbms_lob.instr( userid_list , userid )改成 contains(userid_list , userid);
方法多的是,把过程或者SQL放在数据库一级关键是实现了接口与具体实现的分离,深奥一点的说法是,用接口把调用和具体实现隔离,GOF的设计模式中很多都是在实现变与不变的分离,策略模式,模板方法模式,工厂模式等等就是最好的例子。

再说远一点,贪方便把SQL放在页面或者应用中开发速度是快,ASP年代MS也是这么想的,自从JSP崛起,以及ASP.net哪一个不是搞分层?
层与层之间的调用哪个不是通过接口隔开,不用接口隔开就和一堆类调用另一堆那样,最后变成一碗兰州拉面一样。

说回刚才那件事,现在的状况就是应用对于DBA来说就是一个黑盒,接口就是那条SQL语句,你不能动,只能动数据的一些存储结构,例如索引,表类型等,处处受限。

使用道具 举报

回复
论坛徽章:
6
2012新春纪念徽章
日期:2012-01-04 11:56:442013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08暖羊羊
日期:2015-03-04 14:53:002015年新春福章
日期:2015-03-06 11:58:39
24#
发表于 2010-7-29 01:15 | 只看该作者
项目一般用MVC模式,我们一般都会写一个数据库访问接口公共类,平常的SQL语句我们都放在service层,对于过程来讲,我们也放在service层,由service层调用数据访问接口

使用道具 举报

回复
论坛徽章:
3
2009新春纪念徽章
日期:2009-01-04 14:52:28ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51蜘蛛蛋
日期:2011-09-13 10:35:40
25#
发表于 2010-7-29 08:25 | 只看该作者

回复 #26 whw_0501 的帖子

java项目中,还有一种比较常用到的是:SQL语句放在DAO层,service调用DAO

使用道具 举报

回复
求职 : 数据库开发
论坛徽章:
29
ITPUB学员
日期:2009-10-14 18:49:45至尊黑钻
日期:2015-12-31 11:11:56数据库板块每日发贴之星
日期:2009-10-22 01:01:02优秀写手
日期:2014-04-30 06:00:17ITPUB8周年纪念徽章
日期:2009-10-09 21:30:10秀才
日期:2017-05-17 11:39:09马上有车
日期:2014-10-09 10:14:53马上有钱
日期:2014-02-18 16:43:09路虎
日期:2013-10-15 15:38:59林肯
日期:2013-09-12 15:57:33
26#
发表于 2010-7-29 09:02 | 只看该作者
简单过了一遍帖子- -。。。我怎么觉得有人把一套完整的系统给想象成只由页面和数据库组成的了呢。。。。。

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
9
生肖徽章2007版:牛
日期:2009-03-10 21:26:492010新春纪念徽章
日期:2010-01-04 08:33:082010年世界杯参赛球队:葡萄牙
日期:2010-02-22 14:35:242010新春纪念徽章
日期:2010-03-01 11:19:092010广州亚运会纪念徽章:射击
日期:2010-09-08 23:42:12ITPUB9周年纪念徽章
日期:2010-10-08 09:31:212010广州亚运会纪念徽章:拳击
日期:2010-10-30 00:46:582011新春纪念徽章
日期:2011-02-18 11:43:322011新春纪念徽章
日期:2011-03-01 08:49:39
27#
发表于 2010-7-29 13:15 | 只看该作者
原帖由 风铃中の鬼 于 2010-7-29 09:02 发表
简单过了一遍帖子- -。。。我怎么觉得有人把一套完整的系统给想象成只由页面和数据库组成的了呢。。。。。


引用一下当年我毕业设计时评委老师的一句话,“你这个不就是给数据库加个壳吗”

PS:当年我们专业10个人有9个是做信息系统,9个人中没有一个不用数据库的,老师都看不耐烦才有上面的感叹。幸好我做的是单机软件,剑走偏锋,拿了个校优。

使用道具 举报

回复
论坛徽章:
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
28#
发表于 2010-7-29 21:54 | 只看该作者
原帖由 风铃中の鬼 于 2010-7-29 09:02 发表
简单过了一遍帖子- -。。。我怎么觉得有人把一套完整的系统给想象成只由页面和数据库组成的了呢。。。。。

不管你系统分几层,和数据处理相关的逻辑就应该在数据库里完成。

使用道具 举报

回复
论坛徽章:
41
2010广州亚运会纪念徽章:橄榄球
日期:2011-01-11 06:17:26红孩儿
日期:2012-12-19 11:07:13玉石琵琶
日期:2012-12-19 11:07:13九尾狐狸
日期:2012-12-19 11:07:13嫦娥
日期:2012-12-19 11:07:13玉兔
日期:2012-12-19 11:07:13紫蜘蛛
日期:2012-12-19 11:07:13蓝色妖姬
日期:2012-12-19 11:07:13紫蛋头
日期:2013-01-23 09:04:49SQL大赛参与纪念
日期:2013-12-06 14:03:45
29#
发表于 2010-7-30 02:50 | 只看该作者
Sometimes, we need to consider: using store procedure as the only interface may push the work load from application servers to DB server.
So need to check the pros and cons ahead for different requests. Nothing is absolutely right or wrong.

使用道具 举报

回复
论坛徽章:
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
30#
发表于 2010-7-30 03:09 | 只看该作者
原帖由 xqmei 于 2010-7-30 02:50 发表
Sometimes, we need to consider: using store procedure as the only interface may push the work load from application servers to DB server.
So need to check the pros and cons ahead for different requests. Nothing is absolutely right or wrong.


在大部分情况下,PLSQL存储过程只是SQL的轻量级包装,大部分工作量还是落在SQL. 就算你把存储过程做的事拿到数据库之外完成,SQL还是那些SQL(甚至更烂,如果该程序员不熟悉SQL的话),不仅如此,同一个事务还要和数据库多次交互,而不是仅仅一次存储过程调用,因此想给数据库减负的初衷,往往适得其反。

使用道具 举报

回复

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

本版积分规则 发表回复

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