当前位置导航:炫浪网>>网络学院>>编程开发>>Oracle教程

Oracle Pro*C/C++游标和存储过程性能测试报告


  1.1  目的说明
  
  进行Oracle数据库Pro*C/C++编程往往要对数据库中的记录进行读取,Pro*C/C++开发工具提供了二种对数据库读写的方法:一种我称之为游标(Cursor)的方式;另一种是C语言调用Oracle PL/SQL编程的储存过程方式;这二种方式在编程选择方面一般都没有太多数值比较说明,本文将实际编写测试代码,对这二种编码方式进行实际速度测试为各位读者在以后工作中进行编码选择提供经验。
  
  测试环境 二台PC机其中一台是数据库服务器,另一台是客户端即本文测试代码运行机器
  
  硬件
  
  CPU P4 2.6
  
  内存 1G
  
  硬盘 80G
  
  软件
  
  windows2000
  
  Oracle 8.1.7
  
  VC6
  
  1.2  测试记录
  
  直接使用游标(cursor)和采用存储过程进行整表同步的测试结果
  
  表1 120000条记录测试结果
   
  表2 3000条记录测试结果
   
  表3 9000条记录测试结果
  
  根据测试结果可以看出的确用存储过程在大数据量时是极其有优势的,特别是在大数据量的情况下,并且存储过程的性能极其稳定,cursor方式由于时间长,感觉受网络状况影响较大,时间长短不定。可以得出结论使用储存过程将18倍的提高数据查询读取速度。
  
  1.3  部分测试代码
  
  1.3.1  测试表脚本:
  
  创建用于查询的表
  
  drop table tb_boardt;
  
  create table tb_boardt(
  
  BYBOARDTYPE  NUMBER(3),
  
  ABYBOARDNAME VARCHAR2(15)
  
  ) tablespace cm_space;
  
  用储存过程向表中插入需要查询的120000记录:)
  
  declare
  
  i integer :=0;
  
  begin
  
  for i in 1..20000 loop
  
  insert into tb_boardt values(1,'Allen_BOARD');
  
  insert into tb_boardt values(2,'LILY_BOARD');
  
  insert into tb_boardt values(4,'LIL_BOARD');
  
  insert into tb_boardt values(5,'ALLEN_BOARD');
  
  insert into tb_boardt values(6,'BEMC_BOARD');
  
  insert into tb_boardt values(7,'TWIM_BOARD');
  
  commit;
  
  end loop;
  
  end;
  
  /
  
  用于读取记录的存储过程包头
  
  create or replace package testEptTbl as
  
  type charArrayType is table of varchar2(2048)
  
  index by binary_integer;
  
  type lcharArrayType is table of varchar2(2048)
  
  index by binary_integer;
  
  type numArrayType is table of int
  
  index by binary_integer;
  
  num  INTEGER;
  
  m_RncID INTEGER;
  
  procedure get_R0BrdLib(
  
  batch_size   in   integer,
  
  found     in out integer,
  
  done_fetch   out  integer,
  
  BoardType1 out numArrayType,/*单板类型Board Type*/
  
  BoardName1 out charArrayType/*各子单元类型包含的子单元个数Sunit Number Per Type*/);
  
  end testEptTbl;
  
  /
  
  show err
  
  用于记录的存储过程包体
  
  create or replace package body testEptTbl as
  
  /*  3  */
  
  cursor CUR_R0BrdLib is
  
  SELECT BYBOARDTYPE,ABYBOARDNAME FROM tb_boardt;
  
  procedure get_R0BrdLib(
  
  batch_size   in   integer,
  
  found     in out integer,
  
  done_fetch   out  integer,
  
  BoardType1 out numArrayType,/*单板类型Board Type*/
  
  BoardName1 out charArrayType/*各子单元类型包含的子单元个数Sunit Number Per Type*/) is
  
  begin
  
  if not CUR_R0BrdLib%isopen then
  
  open CUR_R0BrdLib;
  
  end if;
  
  done_fetch := 0;
  
  found := 0;
  
  for i in 1..batch_size loop
  
  fetch CUR_R0BrdLib
  
  into BoardType1(i),BoardName1(i);
  
  if CUR_R0BrdLib%notfound then
  
  close CUR_R0BrdLib;
  
  done_fetch := 1;
  
  exit;
  
  else
  
  found := found + 1;
  
  end if;
  
  end loop;
  
  end get_R0BrdLib;
  
  end testEptTbl;
  
  /
  
  show err
  
  1.3.2  游标方式:
  
  //倒出数据到zdb
  
  void CBOARDT::WriteZdb(int SubNetID,int NodeBID)
  
  {
  
  EXEC SQL BEGIN DECLARE SECTION;
  
  int iSubNetID = SubNetID;
  
  int iNodeBID = NodeBID;
  
  EXEC SQL END DECLARE SECTION;
  
  char tmpbuf[128],StartTime[256],EndTime[256];
相关内容
赞助商链接