Todd

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            65 隨筆 :: 0 文章 :: 24 評論 :: 0 Trackbacks
          移動(dòng)一個(gè)業(yè)務(wù)高并發(fā),接入一個(gè)客戶電話就發(fā)一個(gè)特殊邀請碼(碼為字符加數(shù)字混編,無規(guī)律),碼已存表,業(yè)務(wù)上要 碼和用戶手機(jī)號碼一一對應(yīng);
          所以,來個(gè)用戶就得對未標(biāo)記的碼更新手機(jī)號碼;高并發(fā)時(shí),行鎖及等待比較耗時(shí),導(dǎo)致數(shù)據(jù)庫性能下降嚴(yán)重;
          解決辦法,
          碼表增加seqid,字段;導(dǎo)入數(shù)據(jù)時(shí)使用rownum,做該字段值,建索引;
          更新時(shí),使用序列,
          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 ...;
          以后有新的數(shù)據(jù)要導(dǎo)入,則序列需重置,則:
          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;
          另外,高并發(fā)時(shí)序列的cache要設(shè)置大點(diǎn),一般業(yè)務(wù)設(shè)置100以上,但nocache的時(shí)候性能確實(shí)很差,最大相差20倍. 排序參數(shù):oracle默認(rèn)是NOORDER,如果設(shè)置為ORDER;在單實(shí)例環(huán)境沒有影響,在RAC環(huán)境此時(shí),多實(shí)例實(shí)際緩存相同的序列,此時(shí)在多個(gè)實(shí)例并發(fā)取該序列的時(shí)候,會(huì)有短暫的資源競爭來在多實(shí)例之間進(jìn)行同步。因次性能相比noorder要差,所以RAC環(huán)境非必須的情況下不要使用ORDER,尤其要避免NOCACHE ORDER組合;
          posted on 2012-07-25 02:29 Todd 閱讀(1816) 評論(0)  編輯  收藏 所屬分類: DB
          主站蜘蛛池模板: 梁河县| 郓城县| 德昌县| 千阳县| 汶川县| 鄂托克旗| 平塘县| 孝昌县| 黎城县| 桃源县| 阳东县| 南岸区| 安岳县| 嘉禾县| 东安县| 德安县| 利津县| 呼玛县| 霍山县| 尼勒克县| 麻栗坡县| 黄石市| 图片| 宁陵县| 五大连池市| 广宁县| 东丰县| 贵阳市| 新乡县| 玛多县| 五大连池市| 湄潭县| 阳泉市| 丰城市| 马山县| 陇川县| 白朗县| 永仁县| 科技| 安新县| 乌拉特后旗|