楼主: jxc_hn

请比较一下pro*c和存储过程的效率。

[复制链接]
论坛徽章:
4
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:342012新春纪念徽章
日期:2012-01-04 11:49:54
21#
发表于 2002-10-15 17:30 | 只看该作者
1.我说的那点和使用什么平台是没有关系的(不过我现在确实是在windows下)。你的pro*c程序是一个单独的进程在运行,这对于oracle来说就是一个client端了,如果我需要从oracle中取数据那么就需要把数据取出后在存在这个进程的buffer中了,再针对你取出的数据处理,而server端执行则和oracle的进程共享内寸执行。这两种方式是不同的,是不是client不是由在一台机器上而决定的。有分析表明client/server模式在数据网络传输中有非常大的时间开销。
2.以前就有过业务逻辑是用中间层来实现还是用过程来实现讨论的贴子,这是设计问题,和过程和pro*c的效率比较无关。是因为使用n层结构的设计所以有这个比较,那好,如过问题是基于这个前提下讨论,我觉得你说的也很有道理,因为我现在做的项目也是3层结构(中间件用的是corba,只可恨刚被manager k了一顿,痛苦中.....)。是有很多控制需要在中间层做,不过我个人感觉是能用过程就用过程,毕竟这是最快最安全的方式。
3.最近我在用oracle lite,跟本就不写过程了(555555......,lite不提供这功能),而且我写过程也是用editplus,不用pl/sql developer …… ^_^ 。

使用道具 举报

回复
论坛徽章:
19
ITPUB元老
日期:2005-02-28 12:57:00马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:18
22#
发表于 2002-10-16 11:07 | 只看该作者
用我的感觉来说,用Pro*C实现比较复杂的业务逻辑比较方便,特别是遇到与文件交互操作比较多的情况下。用存储过程效率提高并不多:)但感觉上用C++的话,Pro*C++还是没有Pro*C方便,比如EXEC SQL SELECT a INTO :a FROM table, :a就不能定义为类的成员变量,而要用EXEC SQL BEGIN DECLARE...与EXEC SQL END DECLARE...包含,真麻烦

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
23#
发表于 2002-10-23 09:04 | 只看该作者
大量的存储过程会不会影响数据库的性能呢?

使用道具 举报

回复
论坛徽章:
0
24#
发表于 2002-10-24 13:14 | 只看该作者
PROC比较灵活,但不利于调试。

使用道具 举报

回复
论坛徽章:
10
ITPUB元老
日期:2005-02-28 12:57:002010广州亚运会纪念徽章:保龄球
日期:2011-01-30 11:57:03祖国60周年纪念徽章
日期:2009-10-09 08:28:00参与2009年中国云计算大会纪念
日期:2009-06-05 10:02:28ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452009新春纪念徽章
日期:2009-01-04 14:52:28生肖徽章2007版:鼠
日期:2008-01-02 17:35:53会员2006贡献徽章
日期:2006-04-17 13:46:34授权会员
日期:2005-10-30 17:05:33ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41
25#
发表于 2002-10-25 15:33 | 只看该作者
使用存储过程能较少地占用shared pool空间,减少了语句编译、存储方面的性能损耗。

使用道具 举报

回复
论坛徽章:
0
26#
发表于 2002-10-31 12:04 | 只看该作者
调用与被调用的关系

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2005-10-30 17:05:33ITPUB元老
日期:2005-11-01 07:43:48会员2006贡献徽章
日期:2006-04-17 13:46:34
27#
发表于 2002-10-31 12:18 | 只看该作者
好好好!

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
28#
发表于 2002-11-4 18:18 | 只看该作者
对于这个问题我以前曾经粗略做过测试(pro*c 程序运行在数据库服务器上,去除了网络因素,只是比较单纯的插入、更新等数据库操作),结果发现pro*c 的效率明显高于存储过程, 当时我也很奇怪,因为很多书都提到了存储过程预编译的好处,后来在9i 的relese note发现了pl/sql 执行的执行方式可能是影响其执行效率的因素之一

编译后的PL/SQL的代码只是以跨平台的bytecode 存放在library cache 中,在执行时需要转换为机器代码,这需要额外的开销
当pro*c 程序运行在数据库服务器上,pro*c 执行代码与pl/sql的已编译代码的地位其实是一样的(指与sql 引擎的关系),而对 byte code 的转换对代码的执行效率多少也会有影响.这也是9i 为pl/sql 提供native compilation的原因.
  编译器一般都会对代码进行优化,由于优化的针对性不同,产生的执行代码的效率也会有差异.以上经验从NT平台上得到的,不同操作系统不同的编译器可能会不一样.
  在<<oracle  24x7>> 的第6章中的相关的内容中,鼓励对所有的会话关键型应用程序使用Pro*C或OCI. 并提到oci 是3者中效率最高的,以前曾经在technet forum 上看过一个好象是oracle方面的人说在8.0 后 pro*c 代码经最终也会使用oci 接口.如果是真的那么pro*c 比oci 的效率也不会差太远.

使用道具 举报

回复
论坛徽章:
4
授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34慢羊羊
日期:2015-03-04 14:19:442015年新春福章
日期:2015-03-06 11:57:31
29#
 楼主| 发表于 2002-11-5 08:56 | 只看该作者
目前8.1.7 pro*c 代码仍然没有使用OCI调用,预编译后仍然转换为对sqllib库的调用。

对程序员来说,编写Pro*C比OCI容易多了。但后者功能强大多了,对数据库的访问控制更全面。

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
30#
发表于 2002-11-5 11:26 | 只看该作者
我原来不清楚的是sqllib 库是不是最终也是使用oci 调用,因为我觉得这样对oracle 来讲似乎更经济,不用同时维护两个功能相识的接口.刚才再查了些资料后才知道两者最后都会使用叫UPI的接口(User Programmatic Interface )

PRECOMPILER --> SQLLIB CALLS --->| UPI ---> SQLNET ---> SERVER.
                   OCI CALLS----------------------->| UPI ---> SQLNET ---> SERVER.

oci 虽然用起来好像很繁,但封装和代码管理起来都比pro*c好得多 ,目前已经有一些现成的封装类(如ociwrap),用起来比pro*c 还简单.

9i 还提供了一个在oci 上的c++封装工具OCCI,使用ott 能把数据表直接转换为c++ 类,连访问代码都包含在其中了,感觉上挺方便的,不知道有那位用过的能谈一下经验.

使用道具 举报

回复

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

本版积分规则 发表回复

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