Proc 是Oracle提供的一种数据库操做的AP。它是基于ESql技术的,须要预编译后才能够变成普通c代码,很是不直观,使用起来不太方便,阅读也存在困难。程序员

由于这些问题致使程序员平时开发中会出现一些Proc操做存在效率低下的状况,本文介绍一些Proc一些编译经验,但愿能给你们提供参考。sql

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

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

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

简单实现:服务器

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

优化:oracle

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

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编程 fetch,Oracle Proc编程性能优化经验相关推荐

  1. 我的 .NET Core 博客性能优化经验总结

    点击上方蓝字关注"汪宇杰博客" 导语 去年8月,我用 .NET Core 重写了我的博客系统.经过一年多的优化,服务器响应速度从上线时候的 80ms 提高到了现在的 8ms,十倍提 ...

  2. 我的 .NET Core 博客性能优化经验补充

    点击上方蓝字关注"汪宇杰博客" 导语 去年年底我写了一篇<我的 .NET Core 博客性能优化经验总结>,但后来还发现有一处遗漏需要补充.我们一起来看看~ 牺牲空间换 ...

  3. 欢乐互娱庞池海:《龙之谷》项目性能优化经验分享

    欢乐互娱庞池海:<龙之谷>项目性能优化经验分享 在5月12日,UNITY 2017案例分享专场上,欢乐互娱技术引擎开发工程师娱庞池海分享了<龙之谷>项目性能优化经验.以下为分享 ...

  4. 网易视频云:游戏开发性能优化经验总结

    网易视频云是网易倾力打造的一款基于云计算的分布式多媒体处理集群和专业音视频技术,为客户提供稳定流畅.低时延.高并发的视频直播.录制.存储.转码及点播等音视频的PaaS服务.在线教育.远程医疗.娱乐秀场 ...

  5. oracle 考试技巧,从 TPCH 测试学习性能优化技巧

    一.目标 TPCH是由TPC(Transaction Processing Performance Council)事务处理性能委员会公布的一套针对数据库决策支持能力的测试基准,通过模拟数据库中与业务 ...

  6. 数据库性能优化经验总结

    1.数据库访问优化法则 要正确的优化SQL,我们需要快速定位能性的瓶颈点,也就是说快速找到我们SQL主要的开销在哪里?而大多数情况性能最慢的设备会是瓶颈点,如下载时网络速度可能会是瓶颈点,本地复制文件 ...

  7. 表格存储的Java SDK性能优化经验

    原文发布于阿里云论坛,在圈子内重发. 问题背景 用户通过Java SDK来访问表格存储,在SDK内部也是有开销的,在高并发的场景下这些开销尤其突出.如果SDK的性能很差,用户为了达到更高的QPS,可能 ...

  8. 游戏开发性能优化经验总结

    优化概论 说起游戏的优化,在游戏开发中经常分为这几步: 首先要确定游戏中经常会出现哪些问题 – Profile 然后确定在哪些方向进行性能优化 – Analyze 最后再尽可能将问题逐个解决 – So ...

  9. 记 一次U3D大型多人在线网游性能优化经验

    就是类似这种网游 -香港明星代言图片 这种老2D网游(十几年前PC端的游戏)现在要把它搬到手机上,因为是纯2D的游戏,采用了大量的图片(动画序列帧),并没有用到 3D的技术,市面上有不少是用Cocos ...

最新文章

  1. JQuery 模糊匹配
  2. dos模式下切换电脑用户
  3. UVA - 11882Biggest Number dfs+期望剪枝
  4. LeetCode 663. 均匀树划分(树形DP)
  5. Notepad++ 经常使用快捷键 (MEMO)
  6. java httpurlconnection 开链接后跳转_HttpURLConnection长连接详解
  7. 南邮计算机学院答辩,南京邮电大学答辩PPT模板讲述.pptx
  8. 用PHP的GD库绘制弧形图像
  9. C#自定义控件七水波纹
  10. [转]Sandboxie 的工作原理
  11. Ant运行build.xml执行服务器scp,异常解决jsch.jar
  12. 兼容浏览器的DIV最小高度自适应
  13. 自动驾驶仿真:如何通过TCP方式进行VTD驾驶员仿真
  14. 主板开启网络唤醒_主板远程唤醒设置
  15. 曾经的荣誉,偶然被唤醒
  16. java判断输入大写字母,java用ascii码判断输入的是大写字母,小写字母还是数字...
  17. x64dbg修改后保存到exe
  18. java计算指定日期的上个月
  19. H264中4x4、8x8和16x16尺寸对应场景
  20. linux系统编程之管道(三):命名管道FIFO和mkfifo函数

热门文章

  1. http://www.verycd.com/topics/55332/
  2. xp系统打印机服务器不可用,xp系统使用打印机服务提示“打印不成功”的步骤介绍...
  3. 成都传智播客高校行 为学生答疑解惑
  4. 简历有6个月空白期,面试官会怎么看?
  5. 9.19 算法挑战赛选手答案公布
  6. C#实战007:Excel操作-创建Excel并保存
  7. 整型数据是如何在内存中存储的
  8. 【kubeadm】init配置文件
  9. android sqlite消息列表,SQLiteStudio显示数据库信息
  10. Linux -> 安装Redis