Proc 是Oracle提供的一种数据库操作的API。它是基于ESql技术的,需要预编译后才可以变成普通c代码,非常不直观,使用起来不太方便,阅读也存在困难。

因为这些问题导致程序员平时开发中会出现一些Proc操作存在效率低下的情况,本文介绍一些Proc一些编译经验,希望能给大家提供参考。

下面以一个简单需求进行举例说明:

要求把DB1里面一张数据表tbl_hch_test的数据导出到DB2的同名表。

最快的方法当然是使用oracle的数据泵工具进行压缩导出再导入,但expdp/impdp对数据库环境有特别要求,所以我们需要使用Proc编程,先从DB1取出数据,再insert到Db2里面。

简单实现:

打开一个游标,从DB1循环FETCH数据出来,再使用sprintf拼装成insert语句,到DB2使用exec sql指令执行插入并提交数据库。

优化:

虽然上面的做法可以完成需求,但在效率上存在不优化空间。下面依次进行介绍:

1 使用绑定变量代替sprintf拼装sql

实践证明sprintf函数在对效率要求比较高的场景下容易成为性能瓶颈,使用绑定变量可以避免sprintf调用。

并且,由于数据库里面执行的sql是相同的,不需要每次重新分析sql生成执行计划,也能大大减轻数据库负担,提高执行效率。

2 对insert语句进行预编译,一次编译多次执行,避免使用隐性游标,每次都要重新编译。

同上,预编译是比较消耗cpu的操作。如果sql相同,可以复用游标,减少性能开支。

3 使用批量操作,每次取数和插入数据都使用数组进行绑定。

批量操作可以减少客户端与服务器之间交互次数,加快操作数据。

4 适当加大事务提交间隔(insert多行记录commit一次)

Oracle提交数据库事务时需要将日志从内存刷回磁盘并等待磁盘操作完成才返回,提高事务提交间隔可以减少等待消耗。

优化前后效率测试对比:

相同的操作,从23s降低到1.3s

其它提高效率措施:

以上是在编程上的一些优化,结合oracle一些特性,速度还能再提升,简单介绍几个优化技巧:

1 先删除目标表索引,insert完数据后再重建

2 关闭表的日志, 减少redo日志,alter table tbl_hch_test nologing。装载完数据再改回来。

3 使用append HINT,在高水位上面直接插入数据,加快插入速度。

4 使用并行(parallel)查询,或者使用分区查询(select * from tab parttion(par_name))加快查询速度。

5 如果可能,尽量在数据库服务器上执行程序,减少网络传输开销

关键代码参考:

另外,附上几个平时使用Proc容易出现误区。

1 使用char数组保存数据库varchar2类型字段的值

Proc的char数组对应的数据库类型是char,varchar结构体对应的类型才是varchar2。使用char数组保存数据库varchar2类型字段的值,会导致取出的数据像char类型一样,在末尾自动添加空格。

解决方法可以使用EXEC SQL VAR/ EXEC SQL TYPE同等化变量或者数据类型。或者在预编译时指定CHAR_MAP=string一劳永役

2 需要注意proc的一些命令是预编译命令,只在预编译期间生效,与C语言的宏十分相似。例如以下命令:。

EXEC SQL CONTEXT USE

ESEC SQL Whenever Sqlerror Do

下面举一个常见的错误进行说明:

要完全搞明白proc的原理,建议多分析.pc文件与porc预编译后生成的.c文件代码区别。

3 proc指针变量

Proc可以正确识别指针与普通变量,使用指针做为绑定变量与使用普通变量的方法一样,在变量前面加上冒号即可。

官方文档是这样说的:

有一些程序员不清楚怎么在proc使用指针,会使用memcpy把数据复制多一遍,增加无谓消耗。

4 proc与C语言宏

Proc能识别C语言的一些简单的宏,但如果有复杂的宏(如不定参数宏),proc在预编译时会报错。

此时可以考虑使用gcc –E先对.pc文件进行预处理,之后再使用proc进行预编译。

如果对于proc编程还有什么其它疑惑的地方,欢迎大家与我讨论,或者查阅官方帮助文档。《Oracle Proc官方文档.pdf》

Oracle Proc编程性能优化经验的更多相关文章

  1. oracle数据库应用性能优化经验(培训讲义)

    这是我给公司同事做的内部培训ppt的讲义,给大家分享一下.这是培训大纲,ppt在找地方上传,等找到了会把链接发在这里 . 暂时放在csdn上,赚点下载积分:https://download.csdn. ...

  2. Oracle 11g R2性能优化 10046 event

    作为SQL Trace的扩展功能,Oracle 10046 event(10046事件)是一个重要的调试事件,也可以说是系统性能分析时最重要的一个事件,它包含比SQL Trace更多的信息.但可惜的是 ...

  3. Oracle 11g R2性能优化 tkprof

    另一篇博文总结了关于SQL TRACE工具的使用方式,但是产生的trace文件格式阅读起来并不是十分友好,为了更好的分析trace文件,Oracle也自带了一个格式化工具tkprof.tkprof工具 ...

  4. Oracle 11g R2性能优化 SQL TRACE

    作为Oracle官方自带的一种基本性能诊断工具,SQL Trace可以用来评估当前正在运行的SQL语句的效率,同时为该语句生成统计信息等,并保存这些信息到指定路径下的跟踪文件(trace)当中.SQL ...

  5. Oracle SQL语句性能优化方法大全

    Oracle SQL语句性能优化方法大全 下面列举一些工作中常常会碰到的Oracle的SQL语句优化方法: 1.SQL语句尽量用大写的: 因为oracle总是先解析SQL语句,把小写的字母转换成大写的 ...

  6. Java编程性能优化一

    转自:http://my.oschina.net/xianggao/blog/77224 在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著 ...

  7. Java编程性能优化一些事儿【转】

    原文出处: 陶邦仁 在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序性能. 1. 尽量在合适的场合使用单例 使用单例可以减轻加载 ...

  8. web应用性能优化经验总结

    常见性能优化要求      在我经历的性能优化案例中,常见的问题都是这样开始的:      a) 前台访问很慢,请帮忙分析优化      b) 用户对性能很不满意,再不解决就要投诉      c) 数 ...

  9. 突破10万高并发的nginx性能优化经验(含内核参数优化)

    写的很好,推荐阅读. 转载:http://www.cnblogs.com/kevingrace/p/6094007.html 在日常的运维工作中,经常会用到nginx服务,也时常会碰到nginx因高并 ...

随机推荐

  1. tf serving的使用

    tensorflow_model_server --port=6000 --model_name=text_lstm --model_base_path=/home/guoyingmei/test/t ...

  2. MySQL将一个表的查询结果作为本表的查询条件更新数据

    先建一张S01人口统计信息表: drop table if exists S01人口统计信息; /*================================================== ...

  3. Haproxy安装部署文档及多配置文件管理方案

    一.部署安装 二.软件配置 三.系统服务 四.日志配置 五.小结 文章目录 最近我在负责一个统一接入层的建设项目,涉及到 Haproxy 和 ospf 的运维部署,本文分享一下我在部署 Haproxy ...

  4. Spring Boot使用事务不起作用

    今天使用spring boot做关于事务的demo时发现在service层使用@Transactional注解运行之后遇到错误并不能回滚. @Service public class HelloCon ...

  5. 虚拟机中linux操作系统raid10(5块磁盘)配置流程及损坏磁盘的移除

    打开所要用的虚拟机,点击编辑虚拟机设置,点击硬盘,添加 2.一直点击下一步不做修改,直到最后完成 3.按照以上步骤添加5块磁盘 4.点击开启虚拟机,输入用户名root密码登录进去 5.进入虚拟机后,鼠 ...

  6. 自定义cell的步骤

    ---恢复内容开始--- 自定义cell的步骤(每个cell的高度不一样,每个cell里面显示的内容也不一样) 1.新建一个继承自UITableViewCell的子类 2.在initWithStyle ...

  7. mongodb的部署

    集群mongdb https://www.cnblogs.com/littleatp/p/8563273.html https://www.mongodb.com/download-center/co ...

  8. CAS都不了解,你还怎么看J.U.C

    前言 说到CAS(CompareAndSwap),不得不先说一说悲观锁和乐观锁,因为CAS是乐观锁思想的一种实现. 悲观锁:总是很悲观的认为,每次拿数据都会有其他线程并发执行,所以每次都会进行加锁,用 ...

  9. 十一、springboot 配置log4j2以及打包成zip文件

    前言 其实我们前面已经配置了日志,但是最近总感觉日志日志格式看的不舒服,并且每次打包都是一个jar 文件,lib都包含在jar 中,每次做很小的修改都需要重新替换jar文件,jar文件会比较大,传输起 ...

  10. 【强化学习】DQN 算法改进

    DQN 算法改进 (一)Dueling DQN Dueling DQN 是一种基于 DQN 的改进算法.主要突破点:利用模型结构将值函数表示成更加细致的形式,这使得模型能够拥有更好的表现.下面给出公式 ...