Todd

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  65 随笔 :: 0 文章 :: 24 评论 :: 0 Trackbacks
移动一个业务高并发,接入一个客户电话就发一个特殊邀请码(码为字符加数字混编,无规律),码已存表,业务上要 码和用户手机号码一一对应;
所以,来个用户就得对未标记的码更新手机号码;高并发时,行锁及等待比较耗时,导致数据库性能下降严重;
解决办法,
码表增加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组合;
posted on 2012-07-25 02:29 Todd 阅读(1799) 评论(0)  编辑  收藏 所属分类: DB

只有注册用户登录后才能发表评论。


网站导航: