sql语句如下:
SELECT ins.process_ins_id
FROM t_activity_ins ins INNER JOIN t_activity_def ad ON ad.activity_def_id =
ins.activity_def_id
WHERE start_time IS NOT NULL
AND ins.process_def_id = ad.process_def_id
GROUP BY ins.process_ins_id
执行sql的执行计划如下:
Operation Object Name Rows Bytes Cost Object Node In/Out PStart PStopSELECT STATEMENT Optimizer Mode=CHOOSE 1 K 119
SORT GROUP BY 1 K 51 K 119
HASH JOIN 3 K 169 K 92
INDEX FAST FULL SCAN TMSFZWF.PK_T_ACTIVITY_DEF 4 K 44 K 3
TABLE ACCESS FULL TMSFZWF.T_ACTIVITY_INS 4 K 160 K 86
现在想把T_ACTIVITY_INS的全连接换成用索引查询,应该怎样建索引呢?
附上相关表的建表sqlCREATE TABLE T_ACTIVITY_INS
(
ACTIVITY_INS_ID NUMBER(10) NOT NULL,
PROCESS_INS_ID NUMBER(10),
M_ID NUMBER(10),
PROCESS_DEF_ID NUMBER(10),
ACTIVITY_DEF_ID NUMBER(10),
FLOW_ID NUMBER(10),
START_TIME CHAR(19 BYTE),
END_TIME CHAR(19 BYTE),
STATE NUMBER(2),
PRESTATE NUMBER(2),
PARTICIPANT VARCHAR2(100 BYTE),
PARTICIPANT_TYPE NUMBER(1)
)
TABLESPACE TMSFZ
PCTUSED 0
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
BUFFER_POOL DEFAULT
)
LOGGING
NOCACHE
NOPARALLEL;
CREATE UNIQUE INDEX PK_T_ACTIVITY_INS ON T_ACTIVITY_INS
(ACTIVITY_INS_ID)
LOGGING
TABLESPACE TMSFZ
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
BUFFER_POOL DEFAULT
)
NOPARALLEL;
CREATE INDEX R13_FK ON T_ACTIVITY_INS
(PROCESS_INS_ID)
LOGGING
TABLESPACE TMSFZ
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
BUFFER_POOL DEFAULT
)
NOPARALLEL;
CREATE INDEX R17_FK ON T_ACTIVITY_INS
(M_ID, PROCESS_DEF_ID, ACTIVITY_DEF_ID)
LOGGING
TABLESPACE TMSFZ
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
BUFFER_POOL DEFAULT
)
NOPARALLEL;
ALTER TABLE T_ACTIVITY_INS ADD (
CONSTRAINT PK_T_ACTIVITY_INS PRIMARY KEY (ACTIVITY_INS_ID)
USING INDEX
TABLESPACE TMSFZ
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
));
ALTER TABLE T_ACTIVITY_INS ADD (
CONSTRAINT FK_T_ACTIVI_R13_T_PROCES FOREIGN KEY (PROCESS_INS_ID)
REFERENCES T_PROCESS_INS (PROCESS_INS_ID));ALTER TABLE T_ACTIVITY_INS ADD (
CONSTRAINT FK_T_ACTIVI_R17_T_ACTIVI FOREIGN KEY (M_ID, PROCESS_DEF_ID, ACTIVITY_DEF_ID)
REFERENCES T_ACTIVITY_DEF (M_ID,PROCESS_DEF_ID,ACTIVITY_DEF_ID));CREATE TABLE T_ACTIVITY_DEF
(
M_ID NUMBER(10) NOT NULL,
PROCESS_DEF_ID NUMBER(10) NOT NULL,
ACTIVITY_DEF_ID NUMBER(10) NOT NULL,
NAME VARCHAR2(40 BYTE),
DESCRIPTION VARCHAR2(400 BYTE),
TIME_LIMIT NUMBER(10),
TIME_WAIT NUMBER(10),
TIME_UNIT VARCHAR2(10 BYTE),
OVER_TIME_TYPE NUMBER(1),
TIME_LIMIT_TYPE NUMBER(1),
PREVIOUS NUMBER(1),
REASSIGN_PARTICIPANT_NAME VARCHAR2(400 BYTE),
REASSIGN_PARTICIPANT_ID NUMBER(10),
REASSIGN_PARTICIPANT_TYPE NUMBER(1),
CONDITION_TRANSITION NUMBER(1),
NO_CONDITION_TRANSITION NUMBER(1),
ACCESS_RESTRICTION VARCHAR2(4000 BYTE),
BASETYPE NUMBER(2),
ACTIVITY_TYPE NUMBER(2),
START_MODE NUMBER(1),
PRIORITY NUMBER(2),
JOIN_TYPE NUMBER(1),
SPLIT_TYPE NUMBER(1),
PARTICIPANT NUMBER(10),
PARTICIPANT_TYPE NUMBER(2),
FORM_ID NUMBER(10),
FORM_TYPE NUMBER(1),
FORM_IN_ARGS VARCHAR2(4000 BYTE),
FORM_OUT_ARGS VARCHAR2(4000 BYTE),
SUBPROCESS_FILE_NAME VARCHAR2(256 BYTE),
SUBPROCESS_ID NUMBER(10),
SUBPROCESS_START_TYPE NUMBER(1),
SUBPROCESS_IN_ARGS VARCHAR2(2000 BYTE),
SUBPROCESS_OUT_ARGS VARCHAR2(2000 BYTE),
APP_ID VARCHAR2(400 BYTE),
IS_STATIC NUMBER(1),
PARENT_ACTIVITY_DEF_ID NUMBER(10),
X_POSITION NUMBER(6),
Y_POSITION NUMBER(6),
APP_NAME VARCHAR2(40 BYTE),
APP_IN_ARGS VARCHAR2(400 BYTE),
APP_OUT_ARGS VARCHAR2(400 BYTE),
PARTICIPANT_NAME VARCHAR2(4000 BYTE),
FORM_NAME VARCHAR2(4000 BYTE),
LABEL_FONT_NAME VARCHAR2(100 BYTE),
LABEL_FONT_BGCOLOR VARCHAR2(10 BYTE),
LABEL_FONT_SIZE VARCHAR2(10 BYTE),
LABEL_FONT_COLOR VARCHAR2(10 BYTE),
IS_OPAQUE CHAR(1 BYTE),
SUBPROCESS_NAME VARCHAR2(40 BYTE),
SUBPROCESS_REMOTE_SERVER VARCHAR2(40 BYTE),
PRESCRIPT VARCHAR2(4000 BYTE),
POSSCRIPT VARCHAR2(4000 BYTE)
)
TABLESPACE TMSFZ
PCTUSED 0
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
BUFFER_POOL DEFAULT
)
LOGGING
NOCACHE
NOPARALLEL;
CREATE UNIQUE INDEX PK_T_ACTIVITY_DEF ON T_ACTIVITY_DEF
(M_ID, PROCESS_DEF_ID, ACTIVITY_DEF_ID)
LOGGING
TABLESPACE TMSFZ
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
BUFFER_POOL DEFAULT
)
NOPARALLEL;
CREATE INDEX R7_FK ON T_ACTIVITY_DEF
(M_ID, PROCESS_DEF_ID)
LOGGING
TABLESPACE TMSFZ
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
BUFFER_POOL DEFAULT
)
NOPARALLEL;
ALTER TABLE T_ACTIVITY_DEF ADD (
CONSTRAINT PK_T_ACTIVITY_DEF PRIMARY KEY (M_ID, PROCESS_DEF_ID, ACTIVITY_DEF_ID)
USING INDEX
TABLESPACE TMSFZ
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
));
ALTER TABLE T_ACTIVITY_DEF ADD (
CONSTRAINT FK_T_ACTIVI_R7_T_PROCES FOREIGN KEY (M_ID, PROCESS_DEF_ID)
REFERENCES T_PROCESS_DEF (M_ID,PROCESS_DEF_ID));
SELECT ins.process_ins_id
FROM t_activity_ins ins INNER JOIN t_activity_def ad ON ad.activity_def_id =
ins.activity_def_id
WHERE start_time IS NOT NULL
AND ins.process_def_id = ad.process_def_id
GROUP BY ins.process_ins_id
执行sql的执行计划如下:
Operation Object Name Rows Bytes Cost Object Node In/Out PStart PStopSELECT STATEMENT Optimizer Mode=CHOOSE 1 K 119
SORT GROUP BY 1 K 51 K 119
HASH JOIN 3 K 169 K 92
INDEX FAST FULL SCAN TMSFZWF.PK_T_ACTIVITY_DEF 4 K 44 K 3
TABLE ACCESS FULL TMSFZWF.T_ACTIVITY_INS 4 K 160 K 86
现在想把T_ACTIVITY_INS的全连接换成用索引查询,应该怎样建索引呢?
附上相关表的建表sqlCREATE TABLE T_ACTIVITY_INS
(
ACTIVITY_INS_ID NUMBER(10) NOT NULL,
PROCESS_INS_ID NUMBER(10),
M_ID NUMBER(10),
PROCESS_DEF_ID NUMBER(10),
ACTIVITY_DEF_ID NUMBER(10),
FLOW_ID NUMBER(10),
START_TIME CHAR(19 BYTE),
END_TIME CHAR(19 BYTE),
STATE NUMBER(2),
PRESTATE NUMBER(2),
PARTICIPANT VARCHAR2(100 BYTE),
PARTICIPANT_TYPE NUMBER(1)
)
TABLESPACE TMSFZ
PCTUSED 0
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
BUFFER_POOL DEFAULT
)
LOGGING
NOCACHE
NOPARALLEL;
CREATE UNIQUE INDEX PK_T_ACTIVITY_INS ON T_ACTIVITY_INS
(ACTIVITY_INS_ID)
LOGGING
TABLESPACE TMSFZ
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
BUFFER_POOL DEFAULT
)
NOPARALLEL;
CREATE INDEX R13_FK ON T_ACTIVITY_INS
(PROCESS_INS_ID)
LOGGING
TABLESPACE TMSFZ
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
BUFFER_POOL DEFAULT
)
NOPARALLEL;
CREATE INDEX R17_FK ON T_ACTIVITY_INS
(M_ID, PROCESS_DEF_ID, ACTIVITY_DEF_ID)
LOGGING
TABLESPACE TMSFZ
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
BUFFER_POOL DEFAULT
)
NOPARALLEL;
ALTER TABLE T_ACTIVITY_INS ADD (
CONSTRAINT PK_T_ACTIVITY_INS PRIMARY KEY (ACTIVITY_INS_ID)
USING INDEX
TABLESPACE TMSFZ
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
));
ALTER TABLE T_ACTIVITY_INS ADD (
CONSTRAINT FK_T_ACTIVI_R13_T_PROCES FOREIGN KEY (PROCESS_INS_ID)
REFERENCES T_PROCESS_INS (PROCESS_INS_ID));ALTER TABLE T_ACTIVITY_INS ADD (
CONSTRAINT FK_T_ACTIVI_R17_T_ACTIVI FOREIGN KEY (M_ID, PROCESS_DEF_ID, ACTIVITY_DEF_ID)
REFERENCES T_ACTIVITY_DEF (M_ID,PROCESS_DEF_ID,ACTIVITY_DEF_ID));CREATE TABLE T_ACTIVITY_DEF
(
M_ID NUMBER(10) NOT NULL,
PROCESS_DEF_ID NUMBER(10) NOT NULL,
ACTIVITY_DEF_ID NUMBER(10) NOT NULL,
NAME VARCHAR2(40 BYTE),
DESCRIPTION VARCHAR2(400 BYTE),
TIME_LIMIT NUMBER(10),
TIME_WAIT NUMBER(10),
TIME_UNIT VARCHAR2(10 BYTE),
OVER_TIME_TYPE NUMBER(1),
TIME_LIMIT_TYPE NUMBER(1),
PREVIOUS NUMBER(1),
REASSIGN_PARTICIPANT_NAME VARCHAR2(400 BYTE),
REASSIGN_PARTICIPANT_ID NUMBER(10),
REASSIGN_PARTICIPANT_TYPE NUMBER(1),
CONDITION_TRANSITION NUMBER(1),
NO_CONDITION_TRANSITION NUMBER(1),
ACCESS_RESTRICTION VARCHAR2(4000 BYTE),
BASETYPE NUMBER(2),
ACTIVITY_TYPE NUMBER(2),
START_MODE NUMBER(1),
PRIORITY NUMBER(2),
JOIN_TYPE NUMBER(1),
SPLIT_TYPE NUMBER(1),
PARTICIPANT NUMBER(10),
PARTICIPANT_TYPE NUMBER(2),
FORM_ID NUMBER(10),
FORM_TYPE NUMBER(1),
FORM_IN_ARGS VARCHAR2(4000 BYTE),
FORM_OUT_ARGS VARCHAR2(4000 BYTE),
SUBPROCESS_FILE_NAME VARCHAR2(256 BYTE),
SUBPROCESS_ID NUMBER(10),
SUBPROCESS_START_TYPE NUMBER(1),
SUBPROCESS_IN_ARGS VARCHAR2(2000 BYTE),
SUBPROCESS_OUT_ARGS VARCHAR2(2000 BYTE),
APP_ID VARCHAR2(400 BYTE),
IS_STATIC NUMBER(1),
PARENT_ACTIVITY_DEF_ID NUMBER(10),
X_POSITION NUMBER(6),
Y_POSITION NUMBER(6),
APP_NAME VARCHAR2(40 BYTE),
APP_IN_ARGS VARCHAR2(400 BYTE),
APP_OUT_ARGS VARCHAR2(400 BYTE),
PARTICIPANT_NAME VARCHAR2(4000 BYTE),
FORM_NAME VARCHAR2(4000 BYTE),
LABEL_FONT_NAME VARCHAR2(100 BYTE),
LABEL_FONT_BGCOLOR VARCHAR2(10 BYTE),
LABEL_FONT_SIZE VARCHAR2(10 BYTE),
LABEL_FONT_COLOR VARCHAR2(10 BYTE),
IS_OPAQUE CHAR(1 BYTE),
SUBPROCESS_NAME VARCHAR2(40 BYTE),
SUBPROCESS_REMOTE_SERVER VARCHAR2(40 BYTE),
PRESCRIPT VARCHAR2(4000 BYTE),
POSSCRIPT VARCHAR2(4000 BYTE)
)
TABLESPACE TMSFZ
PCTUSED 0
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
BUFFER_POOL DEFAULT
)
LOGGING
NOCACHE
NOPARALLEL;
CREATE UNIQUE INDEX PK_T_ACTIVITY_DEF ON T_ACTIVITY_DEF
(M_ID, PROCESS_DEF_ID, ACTIVITY_DEF_ID)
LOGGING
TABLESPACE TMSFZ
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
BUFFER_POOL DEFAULT
)
NOPARALLEL;
CREATE INDEX R7_FK ON T_ACTIVITY_DEF
(M_ID, PROCESS_DEF_ID)
LOGGING
TABLESPACE TMSFZ
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
BUFFER_POOL DEFAULT
)
NOPARALLEL;
ALTER TABLE T_ACTIVITY_DEF ADD (
CONSTRAINT PK_T_ACTIVITY_DEF PRIMARY KEY (M_ID, PROCESS_DEF_ID, ACTIVITY_DEF_ID)
USING INDEX
TABLESPACE TMSFZ
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
));
ALTER TABLE T_ACTIVITY_DEF ADD (
CONSTRAINT FK_T_ACTIVI_R7_T_PROCES FOREIGN KEY (M_ID, PROCESS_DEF_ID)
REFERENCES T_PROCESS_DEF (M_ID,PROCESS_DEF_ID));
a,b连个表连接的话。如果其中的一个表的数据较少的话,一个表数据较多的话,这样情况下适合“循环嵌套连接”,数据量小的表作为驱动表。并且在连接的列上面必须有索引。
a,b连个表数据量都比较大的话,采用“哈希连接”速度更快些。“哈希连接”的时候数据库的优化器不会采用索引。
通常情况下,数据库做自动选择代价最小的路径(sql是通过基于成本的优化器,而不是基于规则的),
如果相关的统计信息没有更新的话,数据库的优化器做出来错误的判断。
可以强制一下采用的连接方式。看看哪种效果比较好。毕竟,“实践是掌握真理的唯一标准。”
(ACTIVITY_DEF_ID)
这样,在表连接时就能用上该索引了