中科院架构师,专注企业数字化各个方面,MES/ERP/CRM/OA、物联网、传感器、大数据、ML、AI、云计算openstack、Linux、SpringCloud。
分类: Oracle
2014-07-03 14:21:40
可以确定是merge into 语句的问题了,在ibatis 配置文件中如下这么写是有问题的:
merge into tablename using
(select count(*) count from tablename where condition1) numcount
on (numcount.count <> 0)
when matched then
UPDATE SET A=A+1 WHERE condition2
when not matched then
INSERT (ID,A,B,C,D)
VALUES(tablename_SEQUENCE.NEXTVAL, #a#, #b#, #c#, #d# )
]]>
正确的写法是这样:
merge into tablename using
(select count(*) count from tablename where condition1) numcount
on (numcount.count <> 0)
when matched then
UPDATE SET A=A+1 WHERE condition2
when not matched then
INSERT (ID,A,B,C,D)
VALUES(tableid, #a#, #b#, #c#, #d# )
]]>
分析:
http://hiyachen.blog.chinaunix.net
1:merge into tablename using (select count(*) count from tablename where condition1) numcount
on (numcount.count <> 0)
之前也遇到过,序列值涨到 好几十亿 。这个条件的写法,满足update时,相当于全表都符合,会生成全表的序列。
危险举例:当tablename 达到几十万行记录以后, 可以把数据库搞挂了,CPU飙高
2:sequence的读取不是采用i++这种的形式,
1)系统会读取例如sequence:1-100到内存中去,用于insert操作,当用到50时候,电脑奔溃了。这个时候电脑重启后再进行insert插入则会读取101-200,而不是从51开始。
2)在进行insert操作时候,使用的是sequence:150,你突然rollback一次,那么下次使用的sequence是:151,这个时候150就被浪费了。