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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM