Oracle Pro*C/C++游標和存儲過程性能測試報告
2024-08-29 13:45:49
供稿:網友
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 VC61.2 測試記錄
直接使用游標(cursor)和采用存儲過程進行整表同步的測試結果 表1 120000條記錄測試結果 測試次數使用cursor方式(TD)使用PL/SQL方式(WCDMA)15'22"7"21'23"8"31'15"7"41'22"7"52'20"6"61'19"8"72'32"8"平均2’13.3”7.3”
表2 3000條記錄測試結果 測試次數使用cursor方式(TD)使用PL/SQL方式(WCDMA)13"0"22"0"32"0"42"0"52"0"平均2.2”0” 表3 9000條記錄測試結果 測試次數使用cursor方式(TD)使用PL/SQL方式(WCDMA)10"0"214"1"39"0"413"1"510"0"平均9.2”0.4” 根據測試結果可以看出的確用存儲過程在大數據量時是極其有優勢的,非凡是在大數據量的情況下,并且存儲過程的性能極其穩定,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記錄:)declarei 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];