请问,这里的50000是如何估算出来的?谢谢!

解决方案 »

  1.   

         如果指定CACHE值,ORACLE就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组到cache。 使用cache或许会跳号, 比如我们在创建序列时指定Cache 为100. 在某一个时刻,序列使用到了80. 而在这个时刻,数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失.  在下次启动分配cache时,数据库会从101 开始,在分配100个缓存。即101--200. 而之前分配100个中的80-100这20个因为意外宕机而丢失。 这种情况下就会出现跳号的现象。我们可以在create sequence的时候用nocache防止这种情况。 但是nocache 的性能较差。 如果指定cache而没有设定cache值,默认cache是20个。 这个默认值对于大多数情况下都是够用的。 除非那种每秒上万次的select。 所以具体情况要具体对待。 对于哪些大并发的系统,最好设置在100以上。像移动的BOSS系统,以1000为单位。  CACHE Specify how many values of the sequence the database preallocates and keeps in memory for faster access. This integer value can have 28 or fewer digits. The minimum value for this parameter is 2. For sequences that cycle, this value must be less than the number of values in the cycle. You cannot cache more values than will fit in a given cycle of sequence numbers. Therefore, the maximum value allowed for CACHE must be less than the value determined by the following formula:(CEIL (MAXVALUE - MINVALUE)) / ABS (INCREMENT)If a system failure occurs, then all cached sequence values that have not been used in committed DML statements are lost. The potential number of lost values is equal to the value of the CACHE parameter.Note:Oracle recommends using the CACHE setting to enhance performance if you are using sequences in an Oracle Real Application Clusters environment.NOCACHE  Specify NOCACHE to indicate that values of the sequence are not preallocated. If you omit both CACHE and NOCACHE, then the database caches 20 sequence numbers by default.本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/tianlesoftware/archive/2010/11/08/5995051.aspx
      

  2.   

    根据上面转载内容的描述,以及oracle的官方文档,没有直接说明跟50000相关的内容,^_^
    所以,我估计,你看到那本书上这样说的时候是有上下文的。
      

  3.   

    上下文没有关于缓存数值的估算说明。但本身已经有“如果应用程序每秒从序列中选择10次”这个条件,请问这个条件不是估算缓存数的条件吗?上面大哥也提到“除非那种每秒上万次的select。 所以具体情况要具体对待。 对于哪些大并发的系统,最好设置在100以上。像移动的BOSS系统,以1000为单位。”,并发越大缓存值也应相应提高,我的问题是,它们之间存在怎样的对应关系。
      

  4.   

    这个好像没什么固定值.每个系统数据采集的速度不一样,对cache的需求也不一样.
      

  5.   

    在建序列的时候指定了cache n 会预先在内存里面存n个序列值  优点就是取的时候速度要快些 
    但是有个缺点就是可能会出现序列值存在表的列可能不会连续的 
    你说50000我觉得有点不可思议 用100 应该就够用了
      

  6.   

    -- 序列号,一般是用来插入数据用的!
    -- 比如说:我有一张表,每秒钟插入近7条记录:
    music@SZTYORA> SELECT max(logid) max_logid,
      2         min(logid) min_logid,
      3         max(logid)-min(logid) as lines
      4  FROM musicloguser_detail
      5  WHERE timed >= trunc(sysdate-1)
      6  AND timed < trunc(sysdate); MAX_LOGID  MIN_LOGID      LINES
    ---------- ---------- ----------
      26475360   25887629     587731music@SZTYORA> SELECT COUNT(logid)
      2  FROM musicloguser_detail
      3  WHERE timed >= trunc(sysdate-1)
      4  AND timed < trunc(sysdate);COUNT(LOGID)
    ------------
          587732music@SZTYORA> select  587732/1440/60 from dual;587732/1440/60
    --------------
         6.8024537music@SZTYORA>-- 这个表的 logid字段,就是用序列号递增的,为了维护每30到60秒 cache此表相关的序列一次的话,
    -- 我就应该:
    ALTER sequence musicloguser_seq cache 400;  
    -- cache 400的话,能维持差不多一分钟一次
    -- (没有考虑业务高峰期,其实应该考虑业务高峰期每秒插入数据行的条数更准确)
      

  7.   

    -- 所以,我后来是这样修改的:
    -- 将MUSICLOGUSER_SEQ 每次CACHE 1000个,以提高下面存储过程的运行效率!
    ALTER SEQUENCE MUSICLOGUSER_SEQ CACHE 1000;-- 往musicloguser表中插入数据(同时插入相应的日志表)
    CREATE OR REPLACE PROCEDURE musicloguser_INS_PROC(v_sxml VARCHAR2, v_timed TIMESTAMP)
    IS
      v_sxml2 VARCHAR2(4000);
      v_a1 VARCHAR2(4000);
      v_c1 VARCHAR2(4000);
      v_c2 VARCHAR2(4000);
      v_e1 VARCHAR2(4000);
      v_k VARCHAR2(4000);
      v_nm VARCHAR2(4000);
      v_s VARCHAR2(4000);
      v_v1 VARCHAR2(4000);
      v_q2 VARCHAR2(4000);
      v_v2 VARCHAR2(4000);
      v_v3 VARCHAR2(4000);
      v_p2 VARCHAR2(4000);
      v_mobile VARCHAR2(4000);
      v_mintimed TIMESTAMP(6);
      v_logid NUMBER(38,0);
      v_cnt NUMBER(18,0);
      v_sign NUMBER(18,0);
    BEGIN
      SELECT musicLogUser_seq.nextval INTO v_logid FROM DUAL;  -- 往musicloguser表中插入数据
      INSERT INTO musicloguser(logid, sxml, timed) VALUES(v_logid, v_sxml, v_timed);
      COMMIT;  IF v_sxml like '%&#x%' THEN
        v_sxml2 := unistr(REPLACE(REPLACE(REPLACE(v_sxml,';&#x','\'),'&#x','\'),';<','<'));
      ELSE
        v_sxml2 := v_sxml;
      END IF;  v_a1 := nvl(trim(replace(replace(REGEXP_SUBSTR(v_sxml2,'<a1>.*?</a1>'),'<a1>',''),'</a1>','')),null);
      v_c1 := nvl(trim(replace(replace(REGEXP_SUBSTR(v_sxml2,'<c1>.*?</c1>'),'<c1>',''),'</c1>','')),null);
      v_c2 := nvl(trim(replace(replace(REGEXP_SUBSTR(v_sxml2,'<c2>.*?</c2>'),'<c2>',''),'</c2>','')),null);
      v_e1 := nvl(trim(replace(replace(REGEXP_SUBSTR(v_sxml2,'<e1>.*?</e1>'),'<e1>',''),'</e1>','')),null);
      v_k := nvl(trim(replace(replace(REGEXP_SUBSTR(v_sxml2,'<k>.*?</k>'),'<k>',''),'</k>','')),null);
      v_nm := nvl(trim(replace(replace(REGEXP_SUBSTR(v_sxml2,'<nm>.*?</nm>'),'<nm>',''),'</nm>','')),null);
      v_s := nvl(trim(replace(replace(REGEXP_SUBSTR(v_sxml2,'<s>.*?</s>'),'<s>',''),'</s>','')),null);
      v_v1 := nvl(trim(replace(replace(REGEXP_SUBSTR(v_sxml2,'<v1>.*?</v1>'),'<v1>',''),'</v1>','')),null);
      v_q2 := nvl(trim(replace(replace(REGEXP_SUBSTR(v_sxml2,'<q2>.*?</q2>'),'<q2>',''),'</q2>','')),null);
      v_v2 := nvl(trim(replace(replace(REGEXP_SUBSTR(v_sxml2,'<v2>.*?</v2>'),'<v2>',''),'</v2>','')),null);
      v_v3 := nvl(trim(replace(replace(REGEXP_SUBSTR(v_sxml2,'<v3>.*?</v3>'),'<v3>',''),'</v3>','')),null);
      v_p2 := nvl(trim(replace(replace(REGEXP_SUBSTR(v_sxml2,'<p2>.*?</p2>'),'<p2>',''),'</p2>','')),null);  INSERT INTO musicloguser_detail(C1,R2,C2,K1,E1,U1,T1,K,T,F,G,W,NM,S,V1,O1,FNN,PID,A1,B1,Q2,V2,V3,AC,MN,Z,P2,LOGID,TIMED)
      VALUES( v_c1,
              nvl(trim(replace(replace(REGEXP_SUBSTR(v_sxml2,'<r2>.*?</r2>'),'<r2>',''),'</r2>','')),null),
              v_c2,
              nvl(trim(replace(replace(REGEXP_SUBSTR(v_sxml2,'<k1>.*?</k1>'),'<k1>',''),'</k1>','')),null),
              v_e1,
              nvl(trim(replace(replace(REGEXP_SUBSTR(v_sxml2,'<u1>.*?</u1>'),'<u1>',''),'</u1>','')),null),
              nvl(trim(replace(replace(REGEXP_SUBSTR(v_sxml2,'<t1>.*?</t1>'),'<t1>',''),'</t1>','')),null),
              v_k,
              nvl(trim(replace(replace(REGEXP_SUBSTR(v_sxml2,'<t>.*?</t>'),'<t>',''),'</t>','')),null),
              nvl(trim(replace(replace(REGEXP_SUBSTR(v_sxml2,'<f>.*?</f>'),'<f>',''),'</f>','')),null),
              nvl(trim(replace(replace(REGEXP_SUBSTR(v_sxml2,'<g>.*?</g>'),'<g>',''),'</g>','')),null),
              nvl(trim(replace(replace(REGEXP_SUBSTR(v_sxml2,'<w>.*?</w>'),'<w>',''),'</w>','')),null),
              v_nm,v_s,v_v1,
              nvl(trim(replace(replace(REGEXP_SUBSTR(v_sxml2,'<o1>.*?</o1>'),'<o1>',''),'</o1>','')),null),
              nvl(trim(replace(replace(REGEXP_SUBSTR(v_sxml2,'<fn>.*?</fn>'),'<fn>',''),'</fn>','')),null),
              nvl(trim(replace(replace(REGEXP_SUBSTR(v_sxml2,'<pid>.*?</pid>'),'<pid>',''),'</pid>','')),null),
              v_a1,
              nvl(trim(replace(replace(REGEXP_SUBSTR(v_sxml2,'<b1>.*?</b1>'),'<b1>',''),'</b1>','')),null),
              v_q2,v_v2,v_v3,
              nvl(trim(replace(replace(REGEXP_SUBSTR(v_sxml2,'<ac>.*?</ac>'),'<ac>',''),'</ac>','')),null),
              nvl(trim(replace(replace(REGEXP_SUBSTR(v_sxml2,'<mn>.*?</mn>'),'<mn>',''),'</mn>','')),null),
              nvl(trim(replace(replace(REGEXP_SUBSTR(v_sxml2,'<z>.*?</z>'),'<z>',''),'</z>','')),null),
              v_p2,v_logid,v_timed);  IF v_a1 IS NOT NULL THEN
        SELECT COUNT(logid), NVL(SUM(decode(sign,1,1,0)),0) INTO v_cnt, v_sign FROM musicinstalllog WHERE imsi=v_a1;
        IF v_cnt = 0 AND v_k = 'userlogin' AND nvl(v_q2,'0')<>'0' AND nvl(v_p2,'0')<>'0' THEN
          INSERT INTO  musicinstalllog(logid,mobile,imsi,cid,pid,ver,logcreationdate,phonetype,sign)
          VALUES (v_logid,v_e1,v_a1,v_q2,v_p2,v_c1,v_timed,v_c2,0);
        ELSIF v_cnt <> 0 AND nvl(v_e1,'0')<>'0' AND v_sign=0 THEN
          UPDATE musicinstalllog SET mobile=v_e1, logcreationdate=v_timed, logmodifydate=sysdate, sign=1 WHERE imsi = v_a1;
        END IF;
      END IF;
      COMMIT;
    EXCEPTION WHEN OTHERS THEN
      ROLLBACK;
    END;
    /