两个百万级数据的表
表一DROP TABLE CNGP_MT_LOG CASCADE CONSTRAINTS ; CREATE TABLE CNGP_MT_LOG ( 
  MTSEQ         NUMBER (10), 
  MSGTYPE       NUMBER (2), 
  NEEDREPORT    NUMBER (2), 
  PRIORITY      NUMBER (2), 
  SERVICEID     VARCHAR2 (10), 
  FEETYPE       VARCHAR2 (2), 
  FEEUSERTYPE   VARCHAR2 (2), 
  FEECODE       VARCHAR2 (6), 
  MSGFORMAT     NUMBER (2), 
  SRCTERMID     VARCHAR2 (21), 
  CHARGETERMID  VARCHAR2 (21), 
  DESTTERMID    VARCHAR2 (21), 
  MSGCONTENT    VARCHAR2 (254), 
  SENDDATE      DATE          DEFAULT sysdate, 
  MSGID         VARCHAR2 (20), 
  STATUS        VARCHAR2 (10))
   TABLESPACE USERS
   PCTFREE 10
   INITRANS 1
   MAXTRANS 255
  STORAGE ( 
   INITIAL 65536
   MINEXTENTS 1
   MAXEXTENTS 2147483645
 )
   NOCACHE; 
CREATE INDEX JSCNGP.CNGP_MT_LOG_INDEX01 ON 
  "JSCNGP".CNGP_MT_LOG(MTSEQ) 
  TABLESPACE USERS PCTFREE 10  STORAGE(INITIAL 65536 ) 
; CREATE INDEX JSCNGP.CNGP_MT_LOG_INDEX02 ON 
  "JSCNGP".CNGP_MT_LOG(SERVICEID) 
  TABLESPACE USERS PCTFREE 10  STORAGE(INITIAL 65536 ) 
; CREATE INDEX JSCNGP.CNGP_MT_LOG_INDEX03 ON 
  "JSCNGP".CNGP_MT_LOG(FEETYPE) 
  TABLESPACE USERS PCTFREE 10  STORAGE(INITIAL 65536 ) 
; CREATE INDEX JSCNGP.CNGP_MT_LOG_INDEX04 ON 
  "JSCNGP".CNGP_MT_LOG(FEECODE) 
  TABLESPACE USERS PCTFREE 10  STORAGE(INITIAL 65536 ) 
; CREATE INDEX JSCNGP.CNGP_MT_LOG_INDEX05 ON 
  "JSCNGP".CNGP_MT_LOG(SRCTERMID) 
  TABLESPACE USERS PCTFREE 10  STORAGE(INITIAL 65536 ) 
; CREATE INDEX JSCNGP.CNGP_MT_LOG_INDEX06 ON 
  "JSCNGP".CNGP_MT_LOG(DESTTERMID) 
  TABLESPACE USERS PCTFREE 10  STORAGE(INITIAL 65536 ) 
; CREATE INDEX JSCNGP.CNGP_MT_LOG_INDEX07 ON 
  "JSCNGP".CNGP_MT_LOG(SENDDATE) 
  TABLESPACE USERS PCTFREE 10  STORAGE(INITIAL 65536 ) 

表二
DROP TABLE CNGP_REPORT CASCADE CONSTRAINTS ; CREATE TABLE CNGP_REPORT ( 
  ID           VARCHAR2 (30), 
  MOBILE       VARCHAR2 (21), 
  SPCODE       VARCHAR2 (21), 
  SUB          VARCHAR2 (10), 
  DLVRD        VARCHAR2 (10), 
  SUBMIT_DATE  VARCHAR2 (20), 
  DONE_DATE    VARCHAR2 (20), 
  STAT         VARCHAR2 (20), 
  ERR          VARCHAR2 (10), 
  TXT          VARCHAR2 (50), 
  RECDATE      DATE)
   TABLESPACE USERS
   PCTFREE 10
   INITRANS 1
   MAXTRANS 255
  STORAGE ( 
   INITIAL 65536
   MINEXTENTS 1
   MAXEXTENTS 2147483645
 )
   NOCACHE; 
CREATE INDEX JSCNGP.CNGP_REPORT_INDEX01 ON 
  "JSCNGP".CNGP_REPORT(MOBILE) 
  TABLESPACE USERS PCTFREE 10  STORAGE(INITIAL 65536 ) 
; CREATE INDEX JSCNGP.CNGP_REPORT_INDEX02 ON 
  "JSCNGP".CNGP_REPORT(SPCODE) 
  TABLESPACE USERS PCTFREE 10  STORAGE(INITIAL 65536 ) 
; CREATE INDEX JSCNGP.CNGP_REPORT_INDEX03 ON 
  "JSCNGP".CNGP_REPORT(SUBMIT_DATE) 
  TABLESPACE USERS PCTFREE 10  STORAGE(INITIAL 65536 ) 
; CREATE INDEX JSCNGP.CNGP_REPORT_INDEX04 ON 
  "JSCNGP".CNGP_REPORT(DONE_DATE) 
  TABLESPACE USERS PCTFREE 10  STORAGE(INITIAL 65536 ) 
; CREATE INDEX JSCNGP.CNGP_REPORT_INDEX05 ON 
  "JSCNGP".CNGP_REPORT(STAT) 
  TABLESPACE USERS PCTFREE 10  STORAGE(INITIAL 65536 ) 
; CREATE INDEX JSCNGP.CNGP_REPORT_INDEX06 ON 
  "JSCNGP".CNGP_REPORT(ERR) 
  TABLESPACE USERS PCTFREE 10  STORAGE(INITIAL 65536 ) 

我建了这么多索引,好像太多了,请大虾帮忙看看,怎么优化好
这个表经常做INSERT操作。
执行的比较多的查询SQL语句是
select count(*) from CNGP_MT_LOG where STATUS=0 and to_char(SENDDATE,'yyyymmdd') between to_date(输入日期1) and to_date(输入日期2);select count(*) from SMS_MO_LOG where to_char(RECDATE,'yyyymmdd') between to_date(输入日期1) and to_date(输入日期2);select count(*) from CNGP_REPORT where to_char(RECDATE,'yyyymmdd') between to_date(输入日期1) and to_date(输入日期2);select count(*) from CNGP_REPORT where trim(ERR)='000' and to_char(RECDATE,'yyyymmdd') between to_date(输入日期1) and to_date(输入日期2);select a.FEECODE as FEECODE from CNGP_MT_LOG a,CNGP_REPORT b where a.MSGID=b.ID and trim(b.ERR)='000' and to_char(a.SENDDATE,'yyyymmdd') between to_date(输入日期1) and to_date(输入日期2);
我对索引了解得很少,请大家指点一下,怎么优化表、索引、sql语句。
欢迎拍砖!

解决方案 »

  1.   

    CNGP_MT_LOG :SENDDATE,STATUS,SENDDATE
    CNGP_REPORT:RECDATE,函数索引trim(ERR)基本上就可以了。
      

  2.   

    函数索引能具体写出来吗?
    其他的索引是不是都是每一列对应一个?这样在执行sql语句的时候同时用到几个索引能达到优化的目的吗?
    sql语句不用改?
      

  3.   

    create index idx_name on cngp_report(trim(err));
    对上面的五个字段分别建立索引即可,sql语句不用改。
      

  4.   

    如果我sql语句中不用trim(),是不是就直接建立err的索引就可以了?
      

  5.   

    在建索引的同时,把
    select count(*) from CNGP_MT_LOG where STATUS=0 and to_char(SENDDATE,'yyyymmdd') between to_date(输入日期1) and to_date(输入日期2);
    这条语句改成
    select count(*) from CNGP_MT_LOG where STATUS=0 and SENDDATE between to_date(输入日期1,'yyyy-mm-dd') and to_date(输入日期2,'yyyy-mm-dd');
      

  6.   

    CNGP_MT_LOG(SENDDATE,STATUS)
    SMS_MO_LOG(RECDATE)
    CNGP_REPORT(RECDATE,ERR)
    //检查一遍CNGP_REPORT(ERR)的输入,在输入的时候就不要出现“ ERR ”的情况,这样才能更好的用索引
    CNGP_REPORT(ID,ERR)
    //只需要建立上边的索引就行,修改完索引以后就上楼上说的那样把那些查询sql都改一边:在建索引的同时,把
    select count(*) from CNGP_MT_LOG where STATUS=0 and to_char(SENDDATE,'yyyymmdd') between to_date(输入日期1) and to_date(输入日期2);
    这条语句改成
    select count(*) from CNGP_MT_LOG where STATUS=0 and SENDDATE between to_date(输入日期1,'yyyy-mm-dd') and to_date(输入日期2,'yyyy-mm-dd');