查看: 5810|回复: 19

[笔记] SQL.ProC.OCI速度比较

[复制链接]
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
跳转到指定楼层
1#
发表于 2009-7-6 09:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
准备工作中
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 编辑 ]
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
2#
 楼主| 发表于 2009-7-6 09:38 | 只看该作者
占楼
下一步准备采取EXEC SQL FOR :array_size FETCH C
                      USING DESCRIPTOR select_dp;
批量获取到数组

由于我的c编译器是vc6,只有32位,而数据库11.1.0.7 for windows x64,所以另外下载了instantclient_11_1,编译一楼的程序没有问题
而本例用到了外部函数
extern SQLDA *sqlald();
extern void   sqlclu();

直接编译报错
D:\app\pc>cl -ID:\app\oracle\product\11.1.0\db_1\oci\include -ID:\app\oracle\product\11.1.0\db_1\precomp\public -I. -ID:\app\pc\vc6\include -D_MT -D_DLL -Zi tom
.c /link D:\app\pc\vc6\lib\oci.lib /libpath:D:\app\oracle\product\11.1.0\db_1\precomp\lib /libpath:D:\app\oracle\product\11.1.0\db_1\precomp\lib\msvc  /LIBPATH:
D:\app\pc\vc6\lib msvcrt.lib /nod:libc
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

tom.c
Microsoft (R) Incremental Linker Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:tom.exe
/debug
D:\app\pc\vc6\lib\oci.lib
/libpath:D:\app\oracle\product\11.1.0\db_1\precomp\lib
/libpath:D:\app\oracle\product\11.1.0\db_1\precomp\lib\msvc
/LIBPATH:D:\app\pc\vc6\lib
msvcrt.lib
/nod:libc
tom.obj
tom.obj : error LNK2001: unresolved external symbol _sqlnul
tom.obj : error LNK2001: unresolved external symbol _sqlclu
tom.obj : error LNK2001: unresolved external symbol _sqlald
tom.exe : fatal error LNK1120: 3 unresolved externals

改用instantclient_11_1sdk和precomp sdk后解决
测试结果:arrarysize的影响还是很明显的,但仍然比SQL慢很多,估计与类型转化有关,数字转字符串,再转双精度浮点数

D:\app\pc\instantclient_11_1>sdk\demo\tom2 userid=lt/lt@orcl sqlstmt="select v1,v2 from tcol100 "  arraysize=100

Connected to ORACLE as user: lt/lt@orcl

Unloading 'select v1,v2 from tcol100 '
Array size = 100
V1,V2
20000 rows extracted
0.078000 seconds
sum(v1+v2)=-44907785471.000000

D:\app\pc\instantclient_11_1>sdk\demo\tom2 userid=lt/lt@orcl sqlstmt="select v1,v2 from tcol100 "  arraysize=10

Connected to ORACLE as user: lt/lt@orcl

Unloading 'select v1,v2 from tcol100 '
Array size = 10
V1,V2
20000 rows extracted
0.234000 seconds
sum(v1+v2)=-44907785471.000000

D:\app\pc\instantclient_11_1>sdk\demo\tom2 userid=lt/lt@orcl sqlstmt="select v1,v2 from tcol100 "  arraysize=1000

Connected to ORACLE as user: lt/lt@orcl

Unloading 'select v1,v2 from tcol100 '
Array size = 1000
V1,V2
20000 rows extracted
0.062000 seconds
sum(v1+v2)=-44907785471.000000

D:\app\pc\instantclient_11_1>sdk\demo\tom2 userid=lt/lt@orcl sqlstmt="select v1,v2 from tcol100 "  arraysize=10000

Connected to ORACLE as user: lt/lt@orcl

Unloading 'select v1,v2 from tcol100 '
Array size = 10000
V1,V2
20000 rows extracted
0.047000 seconds
sum(v1+v2)=-44907785471.000000

D:\app\pc\instantclient_11_1>sdk\demo\tom2 userid=lt/lt@orcl sqlstmt="select v1,v2 from tcol100 "  arraysize=20000

Connected to ORACLE as user: lt/lt@orcl

Unloading 'select v1,v2 from tcol100 '
Array size = 20000
V1,V2
20000 rows extracted
0.031000 seconds
sum(v1+v2)=-44907785471.000000

D:\app\pc\instantclient_11_1>

[ 本帖最后由 〇〇 于 2009-7-8 14:26 编辑 ]

instantclient-precomp-win32-11.1.0.7.0.zip

485.26 KB, 下载次数: 14

instantclient-sdk-win32-11.1.0.7.0.zip

1.02 MB, 下载次数: 11

code.rar

3.23 KB, 下载次数: 8

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
3#
 楼主| 发表于 2009-7-6 09:38 | 只看该作者
占楼
用了dbca版主的优化导出工具作为测试范本,array增大后影响不大是因为
      else if (STRNCASECMP("array=",argv[ i],6)==0)
      {
          memset(tempbuf,0,512);
          memcpy(tempbuf,argv[ i]+6,MIN(strlen(argv[ i]) - 6,254));
          DEFAULT_ARRAY_SIZE = atoi(tempbuf);
          if (DEFAULT_ARRAY_SIZE < 5) DEFAULT_ARRAY_SIZE = 5;
          if (DEFAULT_ARRAY_SIZE > 2000) DEFAULT_ARRAY_SIZE = 2000;
      }


D:\app\pc\instantclient_11_1>sdk\demo\ociuldr2 lt/lt@orcl query="select v1,v2 from tcol100 "  file=nul array=10

       0 rows exported at 2009-07-08 15:57:18
   20000 rows exported at 2009-07-08 15:57:19
         output file nul closed at 20000 rows.

0.249000 seconds
sum(v1+v2)=-44907785471.000000

D:\app\pc\instantclient_11_1>sdk\demo\ociuldr2 lt/lt@orcl query="select v1,v2 from tcol100 "  file=nul array=100

       0 rows exported at 2009-07-08 15:57:29
   20000 rows exported at 2009-07-08 15:57:29
         output file nul closed at 20000 rows.

0.078000 seconds
sum(v1+v2)=-44907785471.000000

D:\app\pc\instantclient_11_1>sdk\demo\ociuldr2 lt/lt@orcl query="select v1,v2 from tcol100 "  file=nul array=1000

       0 rows exported at 2009-07-08 15:57:36
   20000 rows exported at 2009-07-08 15:57:36
         output file nul closed at 20000 rows.

0.062000 seconds
sum(v1+v2)=-44907785471.000000

D:\app\pc\instantclient_11_1>sdk\demo\ociuldr2 lt/lt@orcl query="select v1,v2 from tcol100 "  file=nul array=10000

       0 rows exported at 2009-07-08 15:57:40
   20000 rows exported at 2009-07-08 15:57:41
         output file nul closed at 20000 rows.

0.063000 seconds
sum(v1+v2)=-44907785471.000000

D:\app\pc\instantclient_11_1>sdk\demo\ociuldr2 lt/lt@orcl query="select v1,v2 from tcol100 "  file=nul array=20000

       0 rows exported at 2009-07-08 15:57:46
   20000 rows exported at 2009-07-08 15:57:46
         output file nul closed at 20000 rows.

0.063000 seconds
sum(v1+v2)=-44907785471.000000

[ 本帖最后由 〇〇 于 2009-7-8 16:11 编辑 ]

ociuldr2.rar

6.01 KB, 下载次数: 18

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
4#
 楼主| 发表于 2009-7-6 09:38 | 只看该作者
占楼

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
5#
 楼主| 发表于 2009-7-6 09:38 | 只看该作者
占楼

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
6#
 楼主| 发表于 2009-7-6 09:38 | 只看该作者
占楼

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
7#
 楼主| 发表于 2009-7-6 09:38 | 只看该作者
占楼

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
8#
 楼主| 发表于 2009-7-6 09:38 | 只看该作者
占楼

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
9#
 楼主| 发表于 2009-7-6 09:38 | 只看该作者
占楼

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
10#
 楼主| 发表于 2009-7-6 09:39 | 只看该作者
占楼

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表