|
|
对于这个问题我以前曾经粗略做过测试(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 的效率也不会差太远. |
|