两个百万级数据的表
表一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语句。
欢迎拍砖!
表一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语句。
欢迎拍砖!
CNGP_REPORT:RECDATE,函数索引trim(ERR)基本上就可以了。
其他的索引是不是都是每一列对应一个?这样在执行sql语句的时候同时用到几个索引能达到优化的目的吗?
sql语句不用改?
对上面的五个字段分别建立索引即可,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');
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');