一个业务高并发,接入一个客户电话就发一个特殊邀请码(码为字符加数字混编,无规律),码已存表,业务上要 邀请码和用户手机号码一一对应;
所以,来个用户就得对未标记的码更新手机号码;高并发时,行锁及等待比较耗时,导致数据库性能下降严重;更新的操作都在存储过程中。
所以,不改动程序在数据库层解决此问题的办法就是:
解决办法,
码表增加seqid,字段;导入数据时使用rownum,做该字段值,建索引;
更新时,使用序列,
CREATE SEQUENCE SQ_U_SEQ INCREMENT BY 1 START WITH 1 MAXVALUE 50000000 CYCLE CACHE 2000 NOORDER;
更新则:update ... where ... and t.seqid = SQ_U_SEQ.nextval ...;
以后有新的数据要导入,则序列需重置,则:
create or replace procedure seq_reset(v_seqname varchar2) as n number(10);
tsql varchar2(100);
begin
execute immediate ‘select ‘||v_seqname||‘.nextval from dual‘ into n;
n:=-(n-1);
tsql:=‘alter sequence ‘||v_seqname||‘ increment by ‘|| n;
execute immediate tsql;
execute immediate ‘select ‘||v_seqname||‘.nextval from dual‘ into n;
tsql:=‘alter sequence ‘||v_seqname||‘ increment by 1‘;
execute immediate tsql;
end seq_reset;
另外,高并发时序列的cache要设置大点,一般业务设置100以上,但nocache的时候性能确实很差,最大相差20倍. 排序参数:oracle默认是NOORDER,如果设置为ORDER;在单实例环境没有影响,在RAC环境此时,多实例实际缓存相同的序列,此时在多个实例并发取该序列的时候,会有短暂的资源竞争来在多实例之间进行同步。因次性能相比noorder要差,所以RAC环境非必须的情况下不要使用ORDER,尤其要避免NOCACHE ORDER组合;