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的性能对比)的更多相关文章

  1. <每日一题>题目19:简单的程序执行效率面试题

    # 将下面的函数按照执行效率高低排序.它们都接受由0至1之间的数字构成的列表作为输入.这个列表可以很长.一个输入列表的示例如下:[random.random() for i in range(1000 ...

  2. SQL Server 并行操作优化,避免并行操作被抑制而影响SQL的执行效率

    为什么我也要说SQL Server的并行: 这几天园子里写关于SQL Server并行的文章很多,不管怎么样,都让人对并行操作有了更深刻的认识. 我想说的是:尽管并行操作可能(并不是一定)存在这样或者 ...

  3. 优化javaScript代码,提高执行效率

    今天看完书,总结了一下可以如何优化 JavaScript . 1.合并js文件 为优化性能,可以把多个js文件(css文件也可以)合并成极少数大文件.跟十个5k的js文件相比,合并成一个50k的文件更 ...

  4. 解析提高PHP执行效率的50个技巧

    1.用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量, 单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的”函数”(译注:PHP手 ...

  5. (转)对《30个提高Web程序执行效率的好经验》的理解

    阅读了博客园发布的IT文章<30个提高Web程序执行效率的好经验>,这30条准则对我们web开发是非常有用的,不过大家可能对其中的一些准则是知其然而不知其所以然. 下面是我对这些准则的理解 ...

  6. 关于提高python程序执行效率的思路和想法

    相比编译型语言(C系列)python胜在简介的语法和优雅的动态编程体验,但是在执行效率上,python有解释性语言先天的劣势——执行效率较低,为了让编写出的程序获得更快的执行效率,开启此文章. pyt ...

  7. 关于 pgsql 数据库json几个函数用法的效率测试

    关于 pgsql 数据库json几个函数用法的效率测试 关于pgsql 几个操作符的效率测试比较1. json::->> 和 ->> 测试方法:单次运行100次,运行10个单次 ...

  8. 如何提高SQL的执行效率

    一.因情制宜,建立“适当”的索引 建立“适当”的索引是实现查询优化的首要前提. 索引(index)是除表之外另一重要的.用户定义的存储在物理介质上的数据结构.当根据索引码的值搜索数据时,索引提供了对数 ...

  9. php执行效率相关的语句

    一:字符替换: strtr > str_replace > preg_replace 注意: 1:一般用strtr函数的这种形式:string strtr ( string $str , ...

随机推荐

  1. Python 面向对象基础(类、实例、方法、属性封装)

    python是面向对象语言,一切皆对象. 面向过程: 变量和函数. “散落” 在文件的各个位置,甚至是不同文件中.看不出变量与函数的相关性,非常不利于维护,设计模式不清晰. 经常导致程序员,忘记某个变 ...

  2. Java获得数据库查询结果的列数和行数,打印查询结果

    Java连接数据库及简单操作见我以前的一篇随笔:http://www.cnblogs.com/meitian/p/5036332.html   一.获取查询结果的行数和列数 查询结果为ResultSe ...

  3. GsonFormat的使用 (转)

    一.Android Studio快速添加Gson 具体操作:        1.File->Project Structure:   2.app->Dependencies->&qu ...

  4. python--第一天总结

    [变量]1.变量定义的规则: 变量名只能是 字母.数字或下划线的任意组合    变量名的第一个字符不能是数字    以下关键字不能声明为变量名    ['and', 'as', 'assert', ' ...

  5. 六 json&pickle模块

    之前我们学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,eval就不管用了 ...

  6. spring-mvc.xml 和 application-context.xml的区别

    转自:https://www.cnblogs.com/binlin1987/p/7053016.html application-context.xml是全局的,应用于多个serverlet,配合li ...

  7. Anaconda常用命令大全

    使用conda 首先我们将要确认你已经安装好了conda 配置环境 下一步我们将通过创建几个环境来展示conda的环境管理功能.使你更加轻松的了解关于环境的一切.我们将学习如何确认你在哪个环境中,以及 ...

  8. Django配置后台xadmin管理界面

    Django配置后台xadmin管理界面 python版本3.6.5 Django版本1.10.8(刚开始是2.1.5,由于各种错误,改成了低版本) 1.xadmin的安装,下载地址https://g ...

  9. LIS LCS 最长上升子序列 最长公共子序列 ...

    最长上升子序列,问题定义:http://blog.csdn.net/chenwenshi/article/details/6027086 代码: public static void getData( ...

  10. 长时间没有操作putty就会断开连接是怎么回事?

    seconds between keepalives 设置为10就好了, 这个值有什么含义,服务器为了节省资源采取了一些措施,其中一条就是如果检测一个会话(session)几分钟或者几小时没有数据流入 ...