一、概述
1、需要分区优化表
OA_OA.DOC_DOCMAIN,按DOC_TYPE分区;
OA_OA.DOC_WF_OPINION,按DOCUMENT_ID分区;
OA_YWLC.BD_WF_OPTION,按BD_ID分区;
OA_YWLC.BD_CONTENT,按BD_ID分区;
CORDYS.TASK_LIST,按WORKFLOW_MODULE分区;
CORDYS.TASK_LIST_WAIT,按WORKFLOW_MODULE分区。
2、需要清理历史数据表
CORDYS.TASK_LIST中办结文件,移到TASK_LIST_FINISH表中;
CORDYS.WORKFLOW_INSTANCE_TRANSLOG中,2012年以前办结文件,移到WORKFLOW_INSTANCE_TRANSLOGBAK表中。
二、表分区方案
1、TASK_LIST表分区
CREATE TABLE TASK_LIST
(
GUID VARCHAR2(50) NOT NULL,
BO_ID NUMBER(38),
......
)
PARTITION BY LIST(WORKFLOW_MODULE)
(
PARTITION PART_01 VALUES('公文模块'),
PARTITION PART_02 VALUES('业务流程模块'),
PARTITION PART_03 VALUES('通用办公模块'),
PARTITION PART_04 VALUES(DEFAULT)
)
2、DOC_WF_OPINION表分区
2012年以前DOCUMENT_ID最后一个值是634974(1589332条记录),按一年数据量进行分析,一年大概为8万个公文记录。
create table DOC_WF_OPINION
(
ID NUMBER(38) not null,
DOCUMENT_ID NUMBER(38),
......
)
PARTITION BY RANGE (DOCUMENT_ID)
(
PARTITION PART_01 VALUES LESS THAN(634975),
PARTITION PART_02 VALUES LESS THAN(714975),
PARTITION PART_03 VALUES LESS THAN(800000),
PARTITION PART_04 VALUES LESS THAN(890000),
PARTITION PART_05 VALUES LESS THAN(1000000)
)
3、BD_CONTENT表分区
2012年以前BD_ID最后一个值是44001,按一年数据量进行分析,一年(今年,将来还会增加)大概产生11万个工单记录。
create table OA_YWLC.BD_CONTENT
(
CONTENT_ID NUMBER(38) not null,
BD_ID NUMBER(38) not null,
......
)
PARTITION BY RANGE (BD_ID)
(
PARTITION PART_01 VALUES LESS THAN(44002),
PARTITION PART_02 VALUES LESS THAN(154000),
PARTITION PART_03 VALUES LESS THAN(300000),
PARTITION PART_04 VALUES LESS THAN(450000),
PARTITION PART_05 VALUES LESS THAN(650000)
)
4、BD_WF_OPTION表分区
2012年以前BD_ID最后一个值是44001,按一年数据量进行分析,一年(今年,将来还会增加)大概产生11万个工单记录。注:此表目前数据量偏少(截止2012年9月10日,45万条记录),可以考虑不分区。
create table OA_YWLC.BD_WF_OPTION
(
ID NUMBER(38) not null,
OPINION_TYPE VARCHAR2(20),
......
STATES VARCHAR2(1),
IN_ORDER CHAR(2),
TYPE CHAR(10),
BD_ID NUMBER(38) not null
)
PARTITION BY RANGE (BD_ID)
(
PARTITION PART_01 VALUES LESS THAN(44002),
PARTITION PART_02 VALUES LESS THAN(154000),
PARTITION PART_03 VALUES LESS THAN(300000),
PARTITION PART_04 VALUES LESS THAN(450000),
PARTITION PART_05 VALUES LESS THAN(650000)
)
5、TASK_LIST_WAIT表分区
CREATE TABLE TASK_LIST_WAIT
(
GUID VARCHAR2(50) NOT NULL,
BO_ID NUMBER(38),
......
)
PARTITION BY LIST(WORKFLOW_MODULE)
(
PARTITION PART_01 VALUES('公文模块'),
PARTITION PART_02 VALUES('业务流程模块'),
PARTITION PART_03 VALUES('通用办公模块'),
PARTITION PART_04 VALUES(DEFAULT)
)
6、DOC_DOCMAIN表分区
CREATE TABLE DOC_DOCMAIN
(
DOCUMENT_ID NUMBER(38) not null,
DOC_TYPE VARCHAR2(10),
......
)
PARTITION BY LIST(DOC_TYPE)
(
PARTITION PART_01 VALUES('1'),
PARTITION PART_02 VALUES('2'),
PARTITION PART_03 VALUES(
DEFAULT)
)
三、清理历史数据方案
1、清理表TASK_LIST、WORKFLOW_INSTANCE_TRANSLOG办结历史数据原则
2012年前办结流程,并且是子流程(含二级并发子流程办结)已经办结的流程数据;
CORDYS.TASK_LIST中,办结流程消息,移到TASK_LIST_FINISH表中;
CORDYS.WORKFLOW_INSTANCE_TRANSLOG中,2012年以前办结流转记录,移到WORKFLOW_INSTANCE_TRANSLOGBAK。
2、数据处理程序,存储过程
⑴、生成待处理临时表;
⑵、循环处理数据;
⑶、每1000条数据,生成一条处理日志记录,并提交。
四、程序修改
1、修改触发器
TRIGGERAFTER_INSERT_MESSAGE_TRACK
TRIGGERafter_update_MESSAGE_TRACK
把涉及到修改、查询TASK_LIST表的操作语句中,都在WHERE中增加WORKFLOW_MODULE条件;
把涉及到修改、查询DOC_DOCMAIN表的操作语句中,都在WHERE中增加DOC_TYPE条件。
2、修改应用程序
修改公文管理中的办结文件列表查询,在程序中增加二次查询,在第一次查询(TASK_LIST)不命中的情况下(查询结果为空),进行第二次查询(TASK_LIST_FINISH)。综合查询是否也需要此功能改造?
修改流转记录查看功能,在程序中增加二次查询,在第一次查询不命中的情况下(查询WORKFLOW_INSTANCE_TRANSLOG结果为空),进行第二次查询(WORKFLOW_INSTANCE_TRANSLOGBAK)。
五、实施方案
1、源数据表通过更名进行备份;
2、重新创建目标表;
3、在数据处理过程中,去掉索引,数据更新完毕后,重建索引;
4、数据处理通过存储过程完成,分别插入重建目标表(TASK_LIST、WORKFLOW_INSTANCE_TRANSLOG)和历史表(TASK_LIST_FINISH、WORKFLOW_INSTANCE_TRANSLOGBAK);
5、数据处理过程中要生成处理日志,方便监控。
具体实施内容,详见脚本。