近期一项目开发,需定义一表,存储外围系统同步来的数据,在此表中存在起号、止号两字段,现需要根据具体的号码定位此表中记录,因此表数据量为百万数量级,使用>= and <=可成功进行记录的定位,建立索引后,速度不慢,但在并发情况下CPU消耗过高,如发生高并发的情况,数据库CPU会出现耗尽情况,请问各位高手有好的解决办法吗?

解决方案 »

  1.   

    因你提供的信息不多,
    1、初步考虑建立联合索引试验
    2、使用bitmap index索引,如果insert、update、delete操作不多的话
      

  2.   

    谢谢jiaorg,
    开发中用到的sql语句如下:select mc from tableName where dm=? and (号码>=qh and 号码<=zh);表内数据每天同步一次,主要为insert 操作,对qh和zh已经建立了联合索引,查询速度可以,但就是没次查询的时候,数据库服务器的CPU消耗过大。谢谢各位
      

  3.   

    不客气,你试验下建立dm和号码的联合索引,注意下索引列的顺序试验下看看,按照我们现在的经验,建立了联合索引后,cpu cost会大大降低的!!
      

  4.   

    看看执行计划的cpu cost在哪里。
      

  5.   


    楼主可以在QH上建立分区索引,或者表也应该建立分区存储,然后DM也建立一个索引,这样子也许效率会更高点,但最好还是看一下执行计划。看消耗在什么地方。这个才是解决的根本
      

  6.   

    SQL> select nsrmc, to_char(lrrq, 'YYYYMMDD HH24MISS') as xsrq
      2    from fp_xs
      3   where fp_dm = '' and ('' >= fpqh and '' <= fpzh)
      4   order by lrrq desc;未选定行
    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE
       1    0   SORT (ORDER BY)
       2    1     TABLE ACCESS (BY INDEX ROWID) OF 'FP_XS'
       3    2       INDEX (RANGE SCAN) OF 'INDX_FPXS_FPDMFPQH' (NON-UNIQUE
              )Statistics
    ----------------------------------------------------------
            135  recursive calls
              0  db block gets
             68  consistent gets
              0  physical reads
              0  redo size
            270  bytes sent via SQL*Net to client
            373  bytes received via SQL*Net from client
              1  SQL*Net roundtrips to/from client
              1  sorts (memory)
              0  sorts (disk)
              0  rows processed