数据库一对多的查询性能很差啊!

RogerHan 发布于 2012/06/26 13:13
阅读 1K+
收藏 0

有如下两个表:
表1WFMS_INST_PROCESS

create table WFMS_INST_PROCESS
(
  INSTPROCESSID VARCHAR2(32) not null,
  DEFPROCESSID  VARCHAR2(32),
  STATE         INTEGER,
  INITIATOR     VARCHAR2(50),
  INITIATORNAME VARCHAR2(50),
  PARENTID      VARCHAR2(32),
  STARTED       TIMESTAMP(6),
  COMPLETED     TIMESTAMP(6),
  DESCRIPTION   VARCHAR2(200),
  NAME          VARCHAR2(100),
  BUSINESSTITLE VARCHAR2(200),
  LEVELGROUPID  VARCHAR2(32),
  DEMOFLAG      INTEGER,
  WENHAO        VARCHAR2(32),
  BUSINESSID    VARCHAR2(32),
  MODULEID      VARCHAR2(32),
  GUIDANG       VARCHAR2(32)
)

表2WFMS_WORKITEM

create table WFMS_WORKITEM
(
  WORKITEMID       VARCHAR2(32) not null,
  INSTPROCESSID    VARCHAR2(32),
  INSTACTIVITYID   VARCHAR2(32),
  COMMITTEDBY      VARCHAR2(32),
  COMMITTEDTO      VARCHAR2(32),
  SID              INTEGER,
  EXTERNALID       VARCHAR2(20),
  ENTITYID         VARCHAR2(32),
  ASSIGNEENAME     VARCHAR2(50),
  STATE            INTEGER,
  NAME             VARCHAR2(50),
  PROCESSNAME      VARCHAR2(100),
  STARTED          TIMESTAMP(6),
  COMPLETED        TIMESTAMP(6),
  COMPETE          INTEGER,
  TAKED            TIMESTAMP(6),
  SIGNINED         TIMESTAMP(6),
  DEPOSIT          TIMESTAMP(6),
  COMMITTED        TIMESTAMP(6),
  COMMITTEDTODESC  VARCHAR2(200),
  COMMITTEDBYDESC  VARCHAR2(200),
  BUSINESSID       VARCHAR2(50),
  BUSINESSTITLE    VARCHAR2(200),
  TERM             VARCHAR2(50),
  ALARMSTATE       INTEGER,
  PROCESSURL       VARCHAR2(1000),
  TYPE             VARCHAR2(30),
  TEMPLATEPRIORITY INTEGER,
  INSTANCEPRIORITY INTEGER,
  DEMOFLAG         INTEGER,
  MODULEID         VARCHAR2(50),
  COMMITORID       VARCHAR2(32),
  COMMITORNAME     VARCHAR2(32),
  PROCESSDEFPATH   VARCHAR2(200),
  LEVELGROUPID     VARCHAR2(32),
  WENHAO           VARCHAR2(32),
  INITIATORNAME    VARCHAR2(32),
  FORMROLE         VARCHAR2(50),
  ISBACK           VARCHAR2(2)
)

表11WFMS_INST_PROCESS中的INSTPROCESSID字段为主键,表2WFMS_WORKITEM中的INSTPROCESSID字段为外键。这样形成了一个典型的一对多的关系。其中表2WFMS_WORKITEM中的字段ENTITYID为用户的ID,COMPLETED字段为工作完成的时间。

现在我的要求是取出某一个用户在表2WFMS_WORKITEM中的所有数据。这个sql很简单,如下

select * from WFMS_WORKITEM w where w.ENTITYID=?

但是这里个sql查询出的数据有个问题就是里面有很多数据的INSTPROCESSID是相同的。我现在要对INSTPROCESSID进行分组,并取出COMPLETED最大的那条记录,那么也很简单,sql如下:

select w.instProcessId,max(w.completed) from WFMS_WORKITEM w where w.ENTITYID=? group by w.instProcessId

问题来了,表1WFMS_INST_PROCESS中有14多万条的数据,表2WFMS_WORKITEM中有160多万条的数据。现实的情况更复杂,会加入更多的查询条件如标题、开始时间、结束时间等等。这样一来速度就很慢,请问有没有什么号的解决办法!谢谢

加载中
0
鉴客
鉴客

你这两个SQL都是单表的查询,单表查询的优化只能是索引哦

RogerHan
RogerHan
谢谢!
0
IdleMan
IdleMan

得明白,查询条件越多是越有利于提高查询速度的,因为每多一个条件就会被过滤掉一部分也增加了能够利用的索引数量。

group by 后面的字段可以建索引

字段=xxx这种可以建索引

LZ说到的sql语句没有进行join呢?

RogerHan
RogerHan
谢谢
返回顶部
顶部