【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 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组合;

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。