1, 立项优化的第4个sql优化方案通过技术评审。立项优化的其它sql详见附件《立项优化的sql.xlsx》。
=》form_field能否去掉的问题徐其华在跟进,如果能去掉的话将进行再次优化。
=》立项优化的sql有6个,其中有5个优化方案通过技术评审,还有一个需要和业务沟通,徐其华在跟进。
2, 今天晚上在生产库上对OC_CUST_SEND. SEND_RESULT字段加上索引来脚本下面sql每天频繁预警的问题:
预警sql:select count(cs.cust_send_id) asoc_cust_send_count from oc_cust_send cs where cs.send_result=1
索引脚本:createindex PA18DATA.IX_OC_CUST_SEND_SEND_RESULT on PA18DATA.OC_CUST_SEND (SEND_RESULT) ;
我们项目中经常有要求表中一个字段或一组字段必须唯一情况,我们现在通常是写两个sql,一个sql是判断是否存在相应值,然后判断是否insert。
但当并发量大的时候就会有问题,在数据级别会频繁报错。ORA-00001:unique constraint (PA18CMSDATA.UK_KFJ_VOL_VOTE_INFO_YZT_TIME) violated 错误。
原因是 第1个sql运行成功之后,第2个sql运行成功之前存在一定的时间差。期间有可能有insert相同的值。
如果能缩短这两个sql的时间差,就能提高并发,降低报错。
现在把这两个sql和成一个sql写,可以缩短时间差,即可以提高并发。
以后大家参考以下写法来实现这类功能。
INSERTALLINTOkfj_volunteer_vote_info
(id_volunteer_vote_info,
yzt_client_code,
yzt_partyno,
yzt_mobile,
user_no,
created_by,
date_created,
updated_by,
date_updated,
vote_time)
VALUES
(seq_kfj_volunteer_vote_info.nextval,
#yztclientcode#,
#yztpartno#,
#usermobile#,
#userno#,
'sysuser',
SYSDATE,
'sysuser',
SYSDATE,
to_char(SYSDATE, 'yyyyMMdd'))
SELECT1
FROM dual
WHERE NOTEXISTS
(SELECT1
FROM kfj_volunteer_vote_info v
WHERE v.yzt_client_code = ''
AND v.vote_time = to_char(SYSDATE, 'yyyyMMdd'));
下面解释一下这个sql:
SELECT1
FROM dual
WHERE NOTEXISTS
(SELECT1
FROM kfj_volunteer_vote_info v
WHERE v.yzt_client_code = ''
AND v.vote_time = to_char(SYSDATE, 'yyyyMMdd'));
--》这类sql是判断是否要insert, 如果条件为true,则insert,否则不insert, 就是我们要判断是否要insert的条件了。
INSERTALLINTOkfj_volunteer_vote_info
(id_volunteer_vote_info,
yzt_client_code,
yzt_partyno,
yzt_mobile,
user_no,
created_by,
date_created,
updated_by,
date_updated,
vote_time)
VALUES
(seq_kfj_volunteer_vote_info.nextval,
#yztclientcode#,
#yztpartno#,
#usermobile#,
#userno#,
'sysuser',
SYSDATE,
'sysuser',
SYSDATE,
to_char(SYSDATE, 'yyyyMMdd'))
--》 这个就是我们要insert的具体操作了
------------------------------------
另外
Insert all 可以实现按照不同条件 insert 不同表 。
Insert first 可以实现按照不同条件 insert 第1个表。
项目中,大家可以考虑这种写法,来提高并发,谢谢!