移動(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í),使用序列,
所以,來個(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)入,則序列需重置,則:
更新則:update ... where ... and t.seqid = SQ_U_SEQ.nextval ...;
以后有新的數(shù)據(jù)要導(dǎo)入,則序列需重置,則:
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;
另外,高并發(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組合;
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;