【oracle】高并发量表更新注意点

【oracle】高并发量表更新注意点
移动一个业务高并发,接入一个客户电话就发一个特殊邀请码(码为字符加数字混编,无规律),码已存表,业务上要 码和用户手机号码一一对应;
所以,来个用户就得对未标记的码更新手机号码;高并发时,行锁及等待比较耗时,导致数据库性能下降严重;
解决办法,
码表增加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  varchar2as 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组合;

你可能感兴趣的:(【oracle】高并发量表更新注意点)