|
原帖由 newkid 于 2009-2-13 00:49 发表 ![]()
我就知道你要这么说,要不我怎么迟迟不出手呢?你要说高射炮打蚊子不如苍蝇拍那我也没办法。
sqlldr的直接路径加载参数:DIRECT=TRUE
忽略错误的办法:用MERGE, 或 INSERT INTO ... SELECT ... FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM .... WHERE 主键=...)
谢。
那么,至少你也应该承认,包装器速度不慢。今后可以不在速度上叫板了。
怪异问题,追踪到sqlora程序,这是个开源程序。到这么一句:
else if ( _is_prepared(stp) ) {
dbp->status = OCIStmtExecute( dbp->svchp,
stp->stmthp,
dbp->errhp,
(ub4) iterations,
(ub4) 0,
(OCISnapshot *) 0,
(OCISnapshot *) 0,
dbp->exec_flags
);
删掉这句话,立刻就快了,0.几秒,可是什么也不干了。就是说,问题跑到OCI里了,我有点没辙了。不知别人用OCI出现此问题么?
目前只好提供假修改函数临时解决一下。
做了dumy_update,程序(一个DAO函数):
static int dumy_update(DAU *DP,char *stmt)
{
int ret;
if(DP->upd_sth<0) {
char *p=stmt;
p+=sprintf(p,"UPDATE ");
if(*DP->SQL_Connect->DBOWN) p+=sprintf(p,"%s.",DP->SQL_Connect->DBOWN);
p+=sprintf(p,"%s set %s=:%s ",
DP->srm.tabname,
DP->srm.tp[0].name,
DP->srm.tp[0].name);
p=DAU_mk_where(DP,DP->srm.pks,p);
ShowLog(5,"dumy_update:stmt=%s",stmt);
}
return DAU_update(DP,stmt);
}
结果如下:
:~/test> time ./ldasc -P/dev/null <TJ.txt
real 0m5.440s
user 0m1.056s
sys 0m0.500s
时间跟真update差不多,看来,改一个字段与改54个字段没什么区别( 5.44秒与 5.65秒之区别)。以后还真别为了少操作几个字段大动干戈,使用子模板什么的。
日志;
5 ./loadsth:29995 02/17 15:39'13 bind_ins:sth=0,stmt=INSERT INTO TICKET.tjrb (tjdate,unit,tabname,flg,dat1,dat2,dat3,dat4,dat5,dat6,dat7,dat8,
dat9,dat10,dat11,dat12,dat13,dat14,dat15,dat16,dat17,dat18,dat19,dat20,dat21,dat22,dat23,dat24,dat25,dat26,dat27,dat28,dat29,dat30,dat31,
dat32,dat33,dat34,dat35,dat36,dat37,dat38,dat39,dat40,dat41,dat42,dat43,dat44,dat45,dat46,dat47,dat48,dat49,dat50)
VALUES (to_date(:1,'YYYY-MM-DD'), :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13, :14, :15, :16, :17, :18, :19, :20, :21, :22, :23, :24, :25, :26, :27,
:28, :29, :30, :31, :32, :33, :34, :35, :36, :37, :38, :39, :40, :41, :42, :43, :44, :45, :46, :47, :48, :49, :50, :51, :52, :53, :54)
5 ./loadsth:29995 02/17 15:39'13 dumy_update:stmt=UPDATE TICKET.tjrb set tjdate=:tjdate WHERE tjdate=:tjdate AND unit=:unit
AND tabname=:tabname AND flg=:flg
5 ./loadsth:29995 02/17 15:39'13 bind_update:bind=5,sth=1,stmt=UPDATE TICKET.tjrb set tjdate=to_date(:1,'YYYY-MM-DD')
WHERE tjdate=to_date(:2,'YYYY-MM-DD') AND unit=:3 AND tabname=:4 AND flg=:5,
2 ./loadsth:29995 02/17 15:39'19 loadfile:rows=0,upd=0,loss=7552
2 ./loadsth:29995 02/17 15:39'19 loadasc:load 0 rec's time=6,buf=2006.01.31|55|A7|102|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|
0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|
可以看到,包装器为你做了一点工作,你写日期的格式字段和where的主键条件生成都省事了。
刚才网上搜罗一下OCI程序,看到那么多人在痛苦的OCI深渊里挣扎,那么多痛苦的问题,其实我这个包装器都可以解决,真是感到没办法救他们。
虽然用OCI写程序的少之又少,但凡用这东西都有难言之隐,多数是有性能问题或多功能的通用软件。看到许多代码也都是包装器性质,为什么不推出通用数据库访问框架呢?
[ 本帖最后由 yulihua49 于 2009-2-17 16:07 编辑 ] |
|