原帖由 newkid 于 2008-12-15 07:55 发表 ![]()
"ROWID肯定跨事务,但其生命期内不可能重建数据库,或重载数据。"
不要那么绝对,那天你需要从逻辑备份作灾难恢复,你的ROWID就全部变了,那时你可就欲哭无泪。
此外数据还会被复制到CRM, 数据仓库等地方,你的ROWID也全变了。用ROWID作主键是你所有错误中最低级的一个。
"另外,使用那个绑定语句,游标是不能关闭的,只能一次又一次的 reopen ,这让我很不爽。"
谁说的要REOPEN? 一个游标就是用到事务结束,数据全取出来了就关闭。你生成不同的SQL, 反而不需要REOPEN了?
"到现在为止,我仍然不认为绑定不绑定变量,开销上的区别有多大。
尤其是简单语句,ORACLE如此高明,以至于语句分析的开销,你根本察觉不出。
下周,我打算测试一下到底语句分析有多大开销。"
我给你的TOM的书链接中有很好的测试例子,你好好看一下。记得要用ROWID作大量测试,这是最能看出区别的。
我不会在那种场合使用ROWID,只在这个流程里用。你放心吧,什么时候能用ROWID,什么时候不能用我清楚。
关闭游标的问题是OCI的问题,我们不讨论。
我要在OCI环境下测。
现在有了第一部分的结果,是不绑定的:
5 ./loadasc:5576 12/15 14:35'15 tabname=tjrb
5 ./loadasc:5576 12/15 14:35'15 ___SQL_OpenDatabase__: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options
5 ./loadasc:5576 12/15 14:35'15 DB=TICKET
5 ./loadasc:5576 12/15 14:35'15 loadfile:entry
5 ./loadasc:5576 12/15 14:35'15 mkpk:tjdate|unit|tabname|flg|
2 ./loadasc:5576 12/15 14:35'21 loadfile:rows=3776,upd=0,loss=0
//空库添加数据。上午还是2秒,下午不知为什么变6秒了,在IBM H70 SYBASE上是30多秒。
2 ./loadasc:5576 12/15 14:35'21 loadasc:load 3776 rec's time=6,buf=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('2007.01.31','YYYY-MM-DD HH24:MI:SS'),'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)
5 ./loadasc:5587 12/15 14:38'34 tabname=tjrb
5 ./loadasc:5602 12/15 14:40'20 tabname=tjrb
5 ./loadasc:5602 12/15 14:40'20 ___SQL_OpenDatabase__: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options
5 ./loadasc:5602 12/15 14:40'20 DB=TICKET
5 ./loadasc:5602 12/15 14:40'20 loadfile:entry
5 ./loadasc:5602 12/15 14:40'20 mkpk:tjdate|unit|tabname|flg|
//加载时发生重码,进行update,反而比纯粹的insert快
2 ./loadasc:5602 12/15 14:40'24 loadfile:rows=0,upd=3776,loss=0
2 ./loadasc:5602 12/15 14:40'24 loadasc:load 0 rec's time=4,buf=UPDATE TICKET.TJRB SET(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)=(SELECT to_date('2007.01.31','YYYY-MM-DD HH24:MI:SS'),'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 FROM DUAL) WHERE tjdate = to_date('2007.01.31','YYYY-MM-DD HH24:MI:SS') AND unit = '55' AND tabname = 'A7' AND flg = 102
5 ./loadasc:5609 12/15 14:42'19 tabname=tjrb5 ./loadasc:5609 12/15 14:42'19 ___SQL_OpenDatabase__: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit ProductionWith the Partitioning, OLAP and Data Mining options5 ./loadasc:5609 12/15 14:42'19 DB=TICKET5 ./loadasc:5609 12/15 14:42'19 loadfile:entry
5 ./loadasc:5609 12/15 14:42'19 mkpk:tjdate|unit|tabname|flg|
//加载时发生重码,丢掉。不知为何如此慢。
2 ./loadasc:5609 12/15 14:44'48 loadfile:rows=0,upd=0,loss=3776
2 ./loadasc:5609 12/15 14:44'48 loadasc:load 0 rec's time=149,buf=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('2007.01.31','YYYY-MM-DD HH24:MI:SS'),'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):err=1,ORA-00001: unique constraint (TICKET.SYS_C0011534) violated
[ 本帖最后由 yulihua49 于 2008-12-15 15:18 编辑 ] |