OCIlib的几个函数的执行效率(附上pro*c的性能对比)
ocilib提供了以下几个执行sql语句的函数
OCI_ExecuteStmt/OCI_ExecuteStmtFmt 使用没有绑定变量的语句
OCI_Execute 使用有绑定变量的语句
OCI_Immediate/OCI_ImmediateFmt 使非绑定,可返回单行的语句,可以马上输出select值到参数变量中
表结构
create table oci_parse(rid number(10),rtm date default sysdate,rname varchar2(30));
| RNAME | seconds | COUNT(*) | 
| OCI_Prepare out of loop | 31 | 100000 | 
| ImmediateFmt static sql | 123 | 100000 | 
| OCI_Prepare in loop | 35 | 100000 | 
| ExecuteStmtFmt static sql | 130 | 100000 | 
| Immediate static sql | 34 | 100000 | 
| ExecuteStmt static sql | 29 | 100000 | 
首先先看结果,执行类似于
insert into oci_parse (rid, rname) values ( 99, 'ExecuteStmt static sql')
语句,每次插入10W条记录。
SELECT t.rname,(max(t.rtm)-min(t.rtm) )*86400 ,count(*) FROM oci_parse t group by t.rname;
结论:
1、可以看得出带*Fmt函数执行的效率最低,不带*Fmt的函数执行效率都差不多。
查看
SELECT t.SQL_TEXT,t.PARSE_CALLS,t.LOADS,t.EXECUTIONS FROM V_$SQLAREA t where t.SQL_TEXT like '%oci_parse%';
能发现很多*Fmt执行的语句,所以可以判断每条sql语句oracle都进行了解析;而不含*Fmt的语句,只有一条。
对比含*Fmt执行时间(平均126.5s)和不含*Fmt的执行时间(平均32.25s),执行含*Fmt语句要比执行不含*Fmt的语句要多花费3倍的时间。
2、对于OCI_Prepare 循环内绑定语句和循环外绑定语句,循环外绑定语句效率要稍高(31对35),但差别并不是很大。
3、对于静态的sql语句,OCI_Immediate和OCI_ExecuteStmt差别并不大(29对34,另外一次测试是33对32)。
就效率而言,从高到低
ExecuteStmt (static sql) = Immediate(static sql) > OCI_Prepare(out of loop) > OCI_Prepare (in loop) >> ImmediateFmt = ExecuteStmtFmt
int main(){
    OCI_Connection *cn;
    OCI_Statement  *st;
    OCI_Resultset  *rs;
	char dbs [] ="10.8.50.192/dev";
    char usr []= "duser";
    char pwd []="pwd123456" ;
    int rid;
    char rname[30];
    printf("rname [%s]  size =%d\n",rname,sizeof(rname));
    int i;
    if (!OCI_Initialize(err_handler, NULL, OCI_ENV_DEFAULT))
        return EXIT_FAILURE;
	OCI_EnableWarnings(TRUE);
    cn  = OCI_ConnectionCreate(dbs, usr, pwd, OCI_SESSION_DEFAULT);
    st  = OCI_StatementCreate(cn);
	if( !OCI_Prepare(st,  "insert into oci_parse "
							 "(rid, rname)"
							 "values ( :rid, :rname)"
							 )){
			return -1;
	};
	OCI_BindInt(st, OTEXT(":rid"), &rid);
	OCI_BindString(st, OTEXT(":rname"), (otext*) rname, sizeof(rname));
	for(i=0;i<100000;i++){
			rid = 99;
			strcpy(rname,"OCI_Prepare out of loop");
			if(!OCI_Execute(st)){
					printf("line %d",__LINE__);
					return -1;
			}
	}
	OCI_Commit(cn);
	for(i=0;i<100000;i++){
			if( !OCI_Prepare(st,  "insert into oci_parse "
							 "(rid, rname)"
							 "values ( :rid, :rname)"
							 )){
			    printf("line %d",__LINE__);
				return -1;
			};
			OCI_BindInt(st, OTEXT(":rid"), &rid);
			OCI_BindString(st, OTEXT(":rname"), (otext*)rname, sizeof(rname));
			rid = 99;
			strcpy(rname,"OCI_Prepare in  loop");
			if(!OCI_Execute(st)){
					printf("line %d",__LINE__);
					return -1;
			}
	}
	OCI_Commit(cn);
	for(i=0;i<100000;i++){
			if( !OCI_ExecuteStmt(st, "insert into oci_parse  (rid, rname) values ( 99, 'ExecuteStmt static sql') ")){
				printf("line %d",__LINE__);
				return -1;
			}
	}
	OCI_Commit(cn);
	for(i=0;i<100000;i++){
			if( !OCI_ExecuteStmtFmt(st, "insert into oci_parse  (rid, rname) values ( %i, 'ExecuteStmtFmt static sql') ",i)){
				printf("line %d",__LINE__);
				return -1;
			}
	}
	OCI_Commit(cn);
	for(i=0;i<100000;i++){
		if(!OCI_Immediate(cn, "insert into oci_parse  (rid, rname) values ( 99, 'Immediate static sql') ")){
			printf("line %d",__LINE__);
	    	return -1;
	    }
	}
	OCI_Commit(cn);
	for(i=0;i<100000;i++){
		if(!OCI_ImmediateFmt(cn, "insert into oci_parse  (rid, rname) values ( %i, 'ImmediateFmt static sql') ",i+100000)){
			printf("line %d",__LINE__);
	    	return -1;
	    }
	}
	OCI_Commit(cn);
	OCI_Cleanup();
	return 0;
}
pro*c插入10W记录耗时31秒,对比OIClib而言,性能相等。但OIClib多了很多功能,这是pro*c无法提供的。
int main()
{
EXEC SQL BEGIN DECLARE SECTION;
char *sid = "duser/pwd123456@10.8.50.192/dev";
char rname[16];
int rid;
EXEC SQL END DECLARE SECTION;
int i;
EXEC SQL CONNECT :sid;
printf("%s",sqlca.sqlerrm.sqlerrmc);
if(sqlca.sqlcode == 0)
printf("CONNECT OK\n");
else
printf("CONNECT ERROR, sqlcode = %d\n", sqlca.sqlcode); for(i=0;i<100000;i++){
rid=89;
strcpy(rname,"pro*c");
EXEC SQL
insert into oci_parse (rid, rname) values ( :rid, :rname) ;
}
EXEC SQL COMMIT work release;
return 0;
}
OCIlib的几个函数的执行效率(附上pro*c的性能对比)的更多相关文章
- <每日一题>题目19:简单的程序执行效率面试题
		
# 将下面的函数按照执行效率高低排序.它们都接受由0至1之间的数字构成的列表作为输入.这个列表可以很长.一个输入列表的示例如下:[random.random() for i in range(1000 ...
 - SQL Server 并行操作优化,避免并行操作被抑制而影响SQL的执行效率
		
为什么我也要说SQL Server的并行: 这几天园子里写关于SQL Server并行的文章很多,不管怎么样,都让人对并行操作有了更深刻的认识. 我想说的是:尽管并行操作可能(并不是一定)存在这样或者 ...
 - 优化javaScript代码,提高执行效率
		
今天看完书,总结了一下可以如何优化 JavaScript . 1.合并js文件 为优化性能,可以把多个js文件(css文件也可以)合并成极少数大文件.跟十个5k的js文件相比,合并成一个50k的文件更 ...
 - 解析提高PHP执行效率的50个技巧
		
1.用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量, 单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的”函数”(译注:PHP手 ...
 - (转)对《30个提高Web程序执行效率的好经验》的理解
		
阅读了博客园发布的IT文章<30个提高Web程序执行效率的好经验>,这30条准则对我们web开发是非常有用的,不过大家可能对其中的一些准则是知其然而不知其所以然. 下面是我对这些准则的理解 ...
 - 关于提高python程序执行效率的思路和想法
		
相比编译型语言(C系列)python胜在简介的语法和优雅的动态编程体验,但是在执行效率上,python有解释性语言先天的劣势——执行效率较低,为了让编写出的程序获得更快的执行效率,开启此文章. pyt ...
 - 关于 pgsql 数据库json几个函数用法的效率测试
		
关于 pgsql 数据库json几个函数用法的效率测试 关于pgsql 几个操作符的效率测试比较1. json::->> 和 ->> 测试方法:单次运行100次,运行10个单次 ...
 - 如何提高SQL的执行效率
		
一.因情制宜,建立“适当”的索引 建立“适当”的索引是实现查询优化的首要前提. 索引(index)是除表之外另一重要的.用户定义的存储在物理介质上的数据结构.当根据索引码的值搜索数据时,索引提供了对数 ...
 - php执行效率相关的语句
		
一:字符替换: strtr > str_replace > preg_replace 注意: 1:一般用strtr函数的这种形式:string strtr ( string $str , ...
 
随机推荐
- Java8中的[方法引用]“双冒号”——走进Java Lambda(四)
			
前面的章节我们提及到过双冒号运算符,双冒号运算就是Java中的[方法引用],[方法引用]的格式是 类名::方法名 注意是方法名哦,后面没有括号“()”哒.为啥不要括号,因为这样的是式子并不代表一定会调 ...
 - angularjs 获取$scope对象
			
参考 https://blog.csdn.net/u011974399/article/details/77865293 angular.element("[ng-controller=xx ...
 - JPA in
			
CriteriaBuilder.In in = criteriaBuilder.in(root.get("field1")); for (String str : arr) { i ...
 - 导入Unity插件时出现Failed to import package with error: Couldn't decompress package
			
导入Unity插件时出现Failed to import package with error: Couldn't decompress package 一开始以为压缩包本身有问题,坏了 后来发现在父 ...
 - 微信小程序接入百度统计
			
一. 百度统计添加应用,获取appkey和微信小程序统计sdk: 1. 百度统计首页,点击“我的全部应用”右侧的添加按钮: 2. “应用类型”选择小程序统计,选择微信小程序,填写应用名称信息,选择内容 ...
 - 计算Python运行时间
			
可以调用datetime 或者 time库实现得到Python运行时间 方法1 import datetime start_t = datetime.datetime.now() #运行大型代码 e ...
 - VS  unable to update auto-refresh path。。。。
			
手工创建提示报错的路径,重新生成,成功
 - 设置Tomcat的JAVA_OPTS参数
			
修改$TOMCAT_HOME/bin/catalina.bat 添加set JAVA_OPTS= ... rem ----- Execute The Requested Command ------- ...
 - 解决JFinal多文件上传时只获取到第一个文件名
			
我的思路: 用户生成时随即生成一串随机字符作为该用户的文件上传目录,并保存该字符串到用户的某一字段.需要显示上传的附件时,遍历这个文件夹.上传时可把文件名设置为上传时间. 1.生成上传路径 可写在注册 ...
 - Web.config Transformation Syntax for Web Application Project Deployment
			
Web.config Transformation Syntax for Web Application Project Deployment Other Versions Updated: Ma ...