|
|
准备工作中
1.数据源
SQL> create procedure createtab(colc IN NUMBER,PP IN NUMBER:=15,SS IN NUMBER:=2)
2 AUTHID CURRENT_USER
3 is
4 buf varchar(24000):='create table tcol'||to_char(colc)||'(x1 varchar(10),';
5 begin
6 for i in 1..colc-1
7 loop
8 buf:=buf||'v'||to_char(i)||' number('||to_char(PP)||','||to_char(SS)||'),';
9 end loop;
10 buf:=buf||'v'||to_char(colc)||' number('||to_char(PP)||','||to_char(SS)||'))';
11 execute immediate buf;
12 end;
13 /
过程已创建。
SQL> -- inserttab插入一个含有指定数值型列的表,插入的行数可以指定,数值是随机的
SQL> create procedure inserttab(rowc NUMBER,colc NUMBER)
2 AUTHID CURRENT_USER
3 is
4 buf varchar(24000):='insert into tcol'||to_char(colc)||' select level,';
5 begin
6 for i in 1..colc-1
7 loop
8 buf:=buf||'mod(level*DBMS_RANDOM.RANDOM,1e10),';
9 end loop;
10 buf:=buf||'mod(level*DBMS_RANDOM.RANDOM,1e10) from dual connect by level<='||to_char(rowc);
11 execute immediate buf;
12 end;
13 /
过程已创建。
SQL> set timi on
SQL> exec createtab(100); --100列
PL/SQL 过程已成功完成。
已用时间: 00: 00: 00.04
SQL> exec inserttab(20000,100); -2万行
PL/SQL 过程已成功完成。
已用时间: 00: 00: 17.92
2.测试语句
SQL> col s format 99999999999999.9999999
SQL> select sum(v1+v2) s from tcol100;
S
-----------------------
-44907785471.0000000
已用时间: 00: 00: 00.01
#include <stdio.h>
#include <sqlca.h>
#include <time.h>
void sqlerror();
EXEC SQL BEGIN DECLARE SECTION;
char *connstr = "lt/lt@orcl";
char v_x1[30];
double v_v1=0.0;
double v_v2=0.0;
double v_sum=0.0;
long start=0L;
long finish=0L;
EXEC SQL END DECLARE SECTION;
void main() {
EXEC SQL WHENEVER SQLERROR DO sqlerror();
EXEC SQL WHENEVER SQLWARNING CONTINUE;
EXEC SQL CONNECT :connstr;
EXEC SQL DECLARE lt_cursor CURSOR FOR
SELECT /*x1, */v1,v2
FROM tcol100
;
EXEC SQL OPEN lt_cursor;
start = clock();
EXEC SQL WHENEVER NOT FOUND DO break;
for (;;) {
EXEC SQL FETCH lt_cursor INTO /* :v_x1 , */:v_v1, :v_v2;
v_sum+=v_v1+v_v2;
}
finish = clock();
printf( "%f seconds\n", (double)(finish - start) / CLOCKS_PER_SEC );
printf("sum(v1+v2)=%lf\n", v_sum);
EXEC SQL CLOSE lt_cursor;
EXEC SQL COMMIT WORK RELEASE;
return;
}
void sqlerror() {
printf("Stop Error:\t%25i\n", sqlca.sqlcode);
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf("%.70s",sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK WORK RELEASE;
return;
}
D:\app\pc\instantclient_11_1>..\sum2
0.982000 seconds
sum(v1+v2)=-44907785471.000000
第一次比较proc比sql慢多了
[ 本帖最后由 〇〇 于 2009-7-7 14:41 编辑 ] |
|