ORACLE資料庫中關於游標和記錄表的速度測試

2021-05-21 15:14:06 字數 4714 閱讀 3457

1

、問題提出

在我們日常的資料庫操作尤其是儲存過程設計中,經常有記錄表之類的集合、顯示游標等操作,但這兩種資料處理方式在速度及效能上有什麼區別呢? 2

、測試方法 在

oracle

資料庫中建立乙個資料表,然後對建立的資料表分別插入

100條、

1000

條、10000

條、100000

條資料,最後對這些資料分別用游標和記錄表執行相同功能的操作

10次,計算平均消耗的系統時間。 (

1)建立資料表

create table  table_test

(col1  integer,

col2  varchar2(20))

(2)插入資料(以

100000

條資料為例) --

迴圈100000

次新增declare

i     integer;

begin

for i in 1..100000 loop

insert into table_test(col1,col2)

values(i,'add'||i);

end loop;

commit;

exception

when others then

rollback;

end; (

3)游標操作 --

游標處理

declare

v_col1   table_test.col1%type;

v_col2   table_test.col2%type;

v_begin  integer;

v_end    integer;

cursor cur_type is

select col1,col2 from table_test;

begin

select dbms_utility.get_time into v_begin

from   dual;

dbms_output.put_line('

'||v_begin);

if cur_type%isopen = false then

open cur_type;

end if;

fetch cur_type into v_col1,v_col2;

while cur_type%found

loop

fetch cur_type into v_col1,v_col2;

end loop;

close cur_type;   

select dbms_utility.get_time into v_end

from   dual;

dbms_output.put_line('

'||v_end);

dbms_output.put_line('

開始時間

'||v_begin||'

,結束時間

'||v_end||'

消耗時間

'||to_char(v_end-v_begin));

dbms_output.put_line('

'||to_char(v_end-v_begin));

end; (

4)記錄表操作 --

記錄表處理

declare

v_col1   table_test.col1%type;

v_col2   table_test.col2%type;

v_begin  integer;

v_end    integer;

i     integer;

type type_table_test is table of table_test%rowtype

index by binary_integer;

v_table_test   type_table_test;

begin

select dbms_utility.get_time into v_begin

from   dual;

dbms_output.put_line('

'||v_begin);

select col1,col2 bulk collect into v_table_test

from table_test;

for i in 1..v_table_test.count loop

v_col1 := v_table_test(i).col1;

v_col2 := v_table_test(i).col2;

end loop;

select dbms_utility.get_time into v_end

from   dual;

dbms_output.put_line('

'||v_end);

dbms_output.put_line('

開始時間

'||v_begin||'

,結束時間

'||v_end||'

消耗時間

'||to_char(v_end-v_begin));

dbms_output.put_line('

'||to_char(v_end-v_begin));

end; (

5)耗時統計(單位:毫秒)

100條資料 游標

記錄表

開始時間1002253 ,結束時間1002253 消耗時間0

開始時間1004351 ,結束時間1004351 消耗時間0

開始時間1006856 ,結束時間1006856 消耗時間0

開始時間1008770 ,結束時間1008770 消耗時間0

開始時間1009632 ,結束時間1009632 消耗時間0

開始時間1010445 ,結束時間1010445 消耗時間0

開始時間1011326 ,結束時間1011326 消耗時間0

開始時間1012121 ,結束時間1012121 消耗時間0

開始時間1012979 ,結束時間1012979 消耗時間0

開始時間1013698 ,結束時間1013698 消耗時間0

平均:0.2

平均:0

1000

條資料 游標

記錄表

平均:0.7

平均:0.2

10000

條資料 游標

記錄表

平均:6.8

平均:1.8

100000

條資料 游標

記錄表

開始時間1018625 ,結束時間1018693 消耗時間68

開始時間1031904 ,結束時間1031925 消耗時間21

開始時間1019901 ,結束時間1019970 消耗時間69

開始時間1032773 ,結束時間1032792 消耗時間19

開始時間1020903 ,結束時間1020971 消耗時間68

開始時間1033553 ,結束時間1033570 消耗時間17

開始時間1021798 ,結束時間1021867 消耗時間69

開始時間1034384 ,結束時間1034403 消耗時間19

開始時間1022864 ,結束時間1022934 消耗時間70

開始時間1035215 ,結束時間1035234 消耗時間19

開始時間1023901 ,結束時間1023970 消耗時間69

開始時間1036065 ,結束時間1036084 消耗時間19

開始時間1024706 ,結束時間1024776 消耗時間70

開始時間1037067 ,結束時間1037085 消耗時間18

開始時間1025587 ,結束時間1025656 消耗時間69

開始時間1037834 ,結束時間1037853 消耗時間19

開始時間1026432 ,結束時間1026501 消耗時間69

開始時間1038617 ,結束時間1038635 消耗時間18

開始時間1027259 ,結束時間1027329 消耗時間70

開始時間1039598 ,結束時間1039617 消耗時間19

平均:69.1

平均:18.8

3、問題現象描述

oracle

資料庫將管理記憶體區分為系統全域性區

sga(

system global area

)、程式全域性區

pga(

process global area

)、使用者全域性區

uga(

user global area)。

記錄表之類的集合型別在處理時以管道的形式從程式全域性區

pga中讀取資料,游標是以集合的方式從全域性區

sga中讀取資料,這樣在資料處理時,游標就比記錄表多了一些中間環節。

由上述測試結果可以看出:

當使用靜態資料表或表結構相對簡單時,使用記錄表要比游標在速度上提高2~

4倍,但由於記錄表對系統的記憶體要求較高,當單列資料長度過大時,建議不使用記錄表。

另外,並不是所有的宿主語言都支援記錄表之類的集合操作,為增強系統的可移植性,建議在需要用

pl/sql

環境中的資料返回到宿主語言環境(如

delphi

)中時,採用游標的方式返回資料。

資料庫游標(Oracle)

游標是sql的乙個記憶體工作區,由系統或使用者以變數形式定義。游標的作用是用於臨時儲存從資料庫中提取的資料塊。為什麼要用游標?資料庫的資料是存放在磁碟中的,游標是把資料從磁碟中調到計算機記憶體中進行處理,最後將處理結果顯示出來或者最終寫回資料庫,這樣可以提高資料處理的效率,因為頻繁的磁碟資料交換會降...

oracle資料庫中游標的使用

游標,查詢並列印乙個的姓名和薪水 1.游標的屬性 found,notfound declare 定義乙個游標 cursor cemp is select ename,sal from emp 為游標定義對應變數 pename emp.ename type psal emp.sal type begi...

Oracle資料庫之游標

一 準備表和資料 1 建立表 create table emp empno varchar2 32 ename varchar2 32 job varchar2 32 sal varchar2 32 2 新增資料 insert into emp empno,ename,job,sal values ...