日期:2014-05-17  浏览次数:20781 次

一个查询语句的效率问题
sql语句如下:

SELECT a.activity_ins_name, c.procid,
  MAX ( TO_DATE (a.completed_time, 'yyyy-mm-dd hh24:mi:ss')
  - TO_DATE (a.created_time, 'yyyy-mm-dd hh24:mi:ss')
  )
  * 24
  * 60
  * 60 AS max_time,
  MIN ( TO_DATE (a.completed_time, 'yyyy-mm-dd hh24:mi:ss')
  - TO_DATE (a.created_time, 'yyyy-mm-dd hh24:mi:ss')
  )
  * 24
  * 60
  * 60 AS min_time,
  AVG ( TO_DATE (a.completed_time, 'yyyy-mm-dd hh24:mi:ss')
  - TO_DATE (a.created_time, 'yyyy-mm-dd hh24:mi:ss')
  )
  * 24
  * 60
  * 60 AS avg_time,
  COUNT (*) AS flow_count
  FROM t_workitem_his a INNER JOIN t_process_def_manage c ON a.process_def_id =
  c.process_id
  INNER JOIN tfas_r_company_process d ON d.procid = c.procid
  WHERE d.company_code = 'A3201'
  AND a.completed_time >= '2006-01-01'
  AND a.completed_time <= '2010-04-07'
GROUP BY a.activity_ins_name, c.procid;

表结构如下:
CREATE TABLE T_WORKITEM_HIS
(
  WORKITEM_ID NUMBER(10) NOT NULL,
  M_ID NUMBER(10),
  PROCESS_DEF_ID NUMBER(10),
  PROCESS_DEF_NAME VARCHAR2(40 BYTE),
  PROCESS_INS_ID NUMBER(10),
  PROCESS_INS_NAME VARCHAR2(40 BYTE),
  ACTIVITY_INS_ID NUMBER(10),
  ACTIVITY_INS_NAME VARCHAR2(40 BYTE),
  TYPE NUMBER(1),
  CREATED_TIME CHAR(19 BYTE),
  PARTICIPANT VARCHAR2(10 BYTE),
  START_TIME CHAR(19 BYTE),
  TIME_UNIT VARCHAR2(10 BYTE),
  TIME_LIMIT NUMBER(10),
  ATTACHMENT_ID NUMBER(10),
  FORM_ID NUMBER(10),
  APP_ID NUMBER(10),
  ACTIVITY_LIST VARCHAR2(100 BYTE),
  COMPLETED_TIME CHAR(20 BYTE),
  DESCRIPTION VARCHAR2(400 BYTE),
  STATE NUMBER(2),
  PRESTATE NUMBER(2)
)
CREATE TABLE T_PROCESS_DEF_MANAGE
(
  PROCID VARCHAR2(40 BYTE) NOT NULL,
  MODEL_ID NUMBER(10) NOT NULL,
  PROCESS_ID NUMBER(10) NOT NULL,
  MODEL_NAME VARCHAR2(50 BYTE) NOT NULL,
  PROCESS_NAME VARCHAR2(50 BYTE) NOT NULL,
  FORMAL_FLAG NUMBER(1) NOT NULL,
  CHECKOUT_FLAG NUMBER(1),
  PROCESS_DESC VARCHAR2(300 BYTE),
  OPEN_FLAG NUMBER(1),
  STATE_FLAG NUMBER(1),
  PROCESS_MOD_FLAG NUMBER(10),
  CHECKOUT_USER VARCHAR2(20 BYTE),
  PROCESS_FILE_PATH VARCHAR2(100 BYTE) NOT NULL,
  PROCESS_TYPE VARCHAR2(50 BYTE)
)
CREATE TABLE TFAS_R_COMPANY_PROCESS
(
  COMPANY_CODE VARCHAR2(100 BYTE) NOT NULL,
  PROCID VARCHAR2(40 BYTE) NOT NULL
)
t_workitem_his表的数据量在500万左右,其他两张表的数据较少,不超过1000条,针对t_workitem_his表的ACTIVITY_INS_ID,PARTICIPANT,PROCESS_INS_ID,PROCESS_DEF_ID,ACTIVITY_INS_NAME,COMPLETED_TIME,CREATED_TIME
这几个字段已建立索引,其他两张表的用于关联的字段也已做索引。但查询耗时还是很大,大概30秒左右,请问有什么方法提高效率吗?



------解决方案--------------------
--第一个方案
create index idx_1 on t_workitem_his(process_def_id, completed_time, activity_ins_n