利用交换分区优化频繁insert 和delete的分区表

SQL> select * from v$instance;

INSTANCE_NUMBER INSTANCE_NAME
--------------- ----------------
HOST_NAME
----------------------------------------------------------------
VERSION           STARTUP_T STATUS       PAR    THREAD# ARCHIVE LOG_SWITCH_
----------------- --------- ------------ --- ---------- ------- -----------
LOGINS     SHU DATABASE_STATUS   INSTANCE_ROLE      ACTIVE_ST
---------- --- ----------------- ------------------ ---------
              2 csmisc2
cs_dc02
9.2.0.4.0         20-MAY-05 OPEN         YES          2 STARTED
ALLOWED    NO  ACTIVE            PRIMARY_INSTANCE   NORMAL


Elapsed: 00:00:00.10
SQL>

一下测试以 SUBSCRIPTION_HISTORY 为例:

===============================================================================
1、建立测试用分区表 Subscription_History
===============================================================================
SQL> l
  1  create table SUBSCRIPTION_HISTORY (
  2  HistoryId            NUMBER(10)                       DEFAULT 0 NOT NULL,
  3  Mid                  VARCHAR2(14) DEFAULT 'a' NOT NULL,
  4  SubsId               VARCHAR2(15) DEFAULT 'a' NOT NULL,
  5  ActionId             VARCHAR2(3)                      DEFAULT 'a' NOT NULL,
  6  ActionDesc           VARCHAR2(100)                    DEFAULT 'a' NOT NULL,
  7  ActionDate           DATE default sysdate,
  8  ActionPlace          VARCHAR2(2),
  9  ServId               VARCHAR2(12) DEFAULT 'a' NOT NULL,
 10  ICPid                VARCHAR2(10) DEFAULT 'a' NOT NULL,
 11  AccessModeId         NUMBER(7)                        DEFAULT 0 NOT NULL,
 12  ServCatId            NUMBER(4)                        DEFAULT 0 NOT NULL,
 13  ServiceGradeId       NUMBER(3) DEFAULT 0 NOT NULL,
 14  Staff_id             NUMBER(10) ,
 15  Comments             VARCHAR2(200),
 16  ServicePackageId   VARCHAR2(8),
 17  ChargeMid          VARCHAR2(14),
 18  TmpFlag            NUMBER(1)       DEFAULT 0,
 19  VisitCount         NUMBER(3) DEFAULT 0,
 20  SubnPlace          VARCHAR2(2),
 21  SubsCat            NUMBER(3) DEFAULT 99,
 22  ChargeSubsid         varchar2(15),
 23  constraint PK_SUBSCRIPTION_HISTORY primary key (HistoryId) USING INDEX TABLESPACE index_history,
 24  constraint FK_SUBSCRIP_REFERENCE_MISC_ACT foreign key (ActionId)
 25  references Misc_Action (Actionid)
 26  )
 27  PARTITION BY RANGE(actiondate)
 28  (
 29   PARTITION subnhis_P1 VALUES LESS THAN (to_date('2004/02/01','yyyy/mm/dd')) TABLESPACE DATA_SUBN01,
 30   PARTITION subnhis_P2 VALUES LESS THAN (to_date('2004/03/01','yyyy/mm/dd')) TABLESPACE DATA_SUBN02,
 31   PARTITION subnhis_P3 VALUES LESS THAN (to_date('2004/04/01','yyyy/mm/dd')) TABLESPACE DATA_SUBN03,
 32   PARTITION subnhis_P4 VALUES LESS THAN (to_date('2004/05/01','yyyy/mm/dd')) TABLESPACE DATA_SUBN04,
 33   PARTITION subnhis_P5 VALUES LESS THAN (to_date('2004/06/01','yyyy/mm/dd')) TABLESPACE DATA_SUBN05,
 34   PARTITION subnhis_P6 VALUES LESS THAN (to_date('2004/07/01','yyyy/mm/dd')) TABLESPACE DATA_SUBN06,
 35   PARTITION subnhis_P7 VALUES LESS THAN (to_date('2004/08/01','yyyy/mm/dd')) TABLESPACE DATA_SUBN07,
 36   PARTITION subnhis_P8 VALUES LESS THAN (to_date('2004/09/01','yyyy/mm/dd')) TABLESPACE DATA_SUBN08,
 37   PARTITION subnhis_P9 VALUES LESS THAN (to_date('2004/10/01','yyyy/mm/dd')) TABLESPACE DATA_SUBN01,
 38   PARTITION subnhis_P10 VALUES LESS THAN (to_date('2004/11/01','yyyy/mm/dd')) TABLESPACE DATA_SUBN02,
 39   PARTITION subnhis_P11 VALUES LESS THAN (to_date('2004/12/01','yyyy/mm/dd')) TABLESPACE DATA_SUBN03,
 40   PARTITION subnhis_P12 VALUES LESS THAN (to_date('2005/01/01','yyyy/mm/dd')) TABLESPACE DATA_SUBN04
 41* )
SQL> /

Table created.

Elapsed: 00:00:00.29
SQL>

===============================================================================
2、建立分区表 (Subscription_History)的索引
===============================================================================
SQL> l
  1  create index IDX_SUBHISTORY_MID on SUBSCRIPTION_HISTORY (MID)
  2  local
  3  (
  4   PARTITION ind_subnhis_mid_P1 TABLESPACE INDEX_SUBN01,
  5   PARTITION ind_subnhis_mid_P2  TABLESPACE INDEX_SUBN02,
  6   PARTITION ind_subnhis_mid_P3  TABLESPACE INDEX_SUBN03,
  7   PARTITION ind_subnhis_mid_P4  TABLESPACE INDEX_SUBN04,
  8   PARTITION ind_subnhis_mid_P5  TABLESPACE INDEX_SUBN05,
  9   PARTITION ind_subnhis_mid_P6  TABLESPACE INDEX_SUBN06,
 10   PARTITION ind_subnhis_mid_P7  TABLESPACE INDEX_SUBN07,
 11   PARTITION ind_subnhis_mid_P8  TABLESPACE INDEX_SUBN08,
 12   PARTITION ind_subnhis_mid_P9  TABLESPACE INDEX_SUBR01,
 13   PARTITION ind_subnhis_mid_P10 TABLESPACE INDEX_SUBR02,
 14   PARTITION ind_subnhis_mid_P11 TABLESPACE INDEX_SUBR03,
 15   PARTITION ind_subnhis_mid_P12 TABLESPACE INDEX_SUBR04
 16* )
SQL> /

Index created.

Elapsed: 00:00:00.27
SQL>


SQL> l
  1  create index IDX_SUBHISTORY_ServId on SUBSCRIPTION_HISTORY (ServId)
  2  local
  3  (
  4   PARTITION ind_subnhis_serv_P1 TABLESPACE INDEX_SUBN01,
  5   PARTITION ind_subnhis_serv_P2  TABLESPACE INDEX_SUBN02,
  6   PARTITION ind_subnhis_serv_P3  TABLESPACE INDEX_SUBN03,
  7   PARTITION ind_subnhis_serv_P4  TABLESPACE INDEX_SUBN04,
  8   PARTITION ind_subnhis_serv_P5  TABLESPACE INDEX_SUBN05,
  9   PARTITION ind_subnhis_serv_P6  TABLESPACE INDEX_SUBN06,
 10   PARTITION ind_subnhis_serv_P7  TABLESPACE INDEX_SUBN07,
 11   PARTITION ind_subnhis_serv_P8  TABLESPACE INDEX_SUBN08,
 12   PARTITION ind_subnhis_serv_P9  TABLESPACE INDEX_SUBR01,
 13   PARTITION ind_subnhis_serv_P10 TABLESPACE INDEX_SUBR02,
 14   PARTITION ind_subnhis_serv_P11 TABLESPACE INDEX_SUBR03,
 15   PARTITION ind_subnhis_serv_P12 TABLESPACE INDEX_SUBR04
 16* )
SQL> /

Index created.

Elapsed: 00:00:00.22
SQL>


SQL> l
  1  create index IDX_SUBHISTORY_SubsId on SUBSCRIPTION_HISTORY (SubsId)
  2  local
  3  (
  4   PARTITION ind_subnhis_id_P1 TABLESPACE INDEX_SUBN01,
  5   PARTITION ind_subnhis_id_P2  TABLESPACE INDEX_SUBN02,
  6   PARTITION ind_subnhis_id_P3  TABLESPACE INDEX_SUBN03,
  7   PARTITION ind_subnhis_id_P4  TABLESPACE INDEX_SUBN04,
  8   PARTITION ind_subnhis_id_P5  TABLESPACE INDEX_SUBN05,
  9   PARTITION ind_subnhis_id_P6  TABLESPACE INDEX_SUBN06,
 10   PARTITION ind_subnhis_id_P7  TABLESPACE INDEX_SUBN07,
 11   PARTITION ind_subnhis_id_P8  TABLESPACE INDEX_SUBN08,
 12   PARTITION ind_subnhis_id_P9  TABLESPACE INDEX_SUBR01,
 13   PARTITION ind_subnhis_id_P10 TABLESPACE INDEX_SUBR02,
 14   PARTITION ind_subnhis_id_P11 TABLESPACE INDEX_SUBR03,
 15   PARTITION ind_subnhis_id_P12 TABLESPACE INDEX_SUBR04
 16* )
SQL> /

Index created.

Elapsed: 00:00:00.22
SQL>

SQL> select count(*) from SUBSCRIPTION_HISTORY;

  COUNT(*)
----------
         0

Elapsed: 00:00:00.02
SQL>


===============================================================================
3、插入并检验测试数据
===============================================================================
SQL> ALTER TABLE SUBSCRIPTION_HISTORY DISABLE CONSTRAINT FK_SUBSCRIP_REFERENCE_MISC_ACT CASCADE;

Table altered.

Elapsed: 00:00:00.04
SQL>
SQL> insert /*+ APPEND */ into SUBSCRIPTION_HISTORY(HistoryId,actiondate)        
  2             select rownum,to_date('31-dec-2004')-mod(rownum+1000,360) from t
  3  nologging;

928352 rows created.

Elapsed: 00:02:12.74
SQL> commit;

Commit complete.

Elapsed: 00:00:00.04
SQL>
SQL> update SUBSCRIPTION_HISTORY nologging set Actionid=(select Actionid from Misc_Action where rownum<2);

928352 rows updated.

Elapsed: 00:01:02.22
SQL> commit;

Commit complete.

Elapsed: 00:00:00.04
SQL>
SQL> ALTER TABLE SUBSCRIPTION_HISTORY ENABLE CONSTRAINT FK_SUBSCRIP_REFERENCE_MISC_ACT;

Table altered.

Elapsed: 00:00:06.16
SQL>


==================================================================================================
4、将老的历史表改名为 Subscription_History_bak
==================================================================================================
SQL> rename SUBSCRIPTION_HISTORY to SUBSCRIPTION_HISTORY_bak;

Table renamed.

Elapsed: 00:00:00.11
SQL>

----------------------------------------------------------------
检查rename后的状态:
----------------------------------------------------------------
drop table user_segment_tmp;
create table user_segment_tmp nologging as select * from user_segments;

set linesize 120
BREAK ON SEGMENT_NAME SKIP 1
col TABLESPACE_NAME for a30
col SEGMENT_NAME for a30
col PARTITION_NAME for a30
SELECT /*+ RULE */ SEGMENT_NAME,PARTITION_NAME,BYTES/1024/1024 MB ,TABLESPACE_NAME
FROM user_segment_tmp WHERE SEGMENT_NAME ='SUBSCRIPTION_HISTORY_BAK'
ORDER BY 1,2,3,4

SQL> l
  1  SELECT /*+ RULE */ SEGMENT_NAME,PARTITION_NAME,BYTES/1024/1024 MB ,TABLESPACE_NAME
  2  FROM user_segment_tmp WHERE SEGMENT_NAME ='SUBSCRIPTION_HISTORY_BAK'
  3* ORDER BY 1,2,3,4
SQL> /

SEGMENT_NAME                   PARTITION_NAME                         MB TABLESPACE_NAME
------------------------------ ------------------------------ ---------- ------------------------------
SUBSCRIPTION_HISTORY_BAK       SUBNHIS_P1                        7.90625 DATA_SUBN01
                               SUBNHIS_P10                             8 DATA_SUBN02
                               SUBNHIS_P11                             8 DATA_SUBN03
                               SUBNHIS_P12                             8 DATA_SUBN04
                               SUBNHIS_P2                              8 DATA_SUBN02
                               SUBNHIS_P3                              8 DATA_SUBN03
                               SUBNHIS_P4                              8 DATA_SUBN04
                               SUBNHIS_P5                              8 DATA_SUBN05
                               SUBNHIS_P6                              8 DATA_SUBN06
                               SUBNHIS_P7                              8 DATA_SUBN07
                               SUBNHIS_P8                              8 DATA_SUBN08
                               SUBNHIS_P9                        7.90625 DATA_SUBN01


12 rows selected.

Elapsed: 00:00:00.02
SQL>

break on table_name skip 1
set pages 1000
select table_name,partition_name,tablespace_name,PARTITION_POSITION from user_tab_partitions
where TABLE_NAME ='SUBSCRIPTION_HISTORY_BAK' order by table_name,PARTITION_POSITION
/

SQL> l
  1  select table_name,partition_name,tablespace_name,PARTITION_POSITION from user_tab_partitions
  2* where TABLE_NAME ='SUBSCRIPTION_HISTORY_BAK' order by table_name,PARTITION_POSITION
SQL> /

TABLE_NAME                     PARTITION_NAME                 TABLESPACE_NAME                PARTITION_POSITION
------------------------------ ------------------------------ ------------------------------ ------------------
SUBSCRIPTION_HISTORY_BAK       SUBNHIS_P1                     DATA_SUBN01                                     1
                               SUBNHIS_P2                     DATA_SUBN02                                     2
                               SUBNHIS_P3                     DATA_SUBN03                                     3
                               SUBNHIS_P4                     DATA_SUBN04                                     4
                               SUBNHIS_P5                     DATA_SUBN05                                     5
                               SUBNHIS_P6                     DATA_SUBN06                                     6
                               SUBNHIS_P7                     DATA_SUBN07                                     7
                               SUBNHIS_P8                     DATA_SUBN08                                     8
                               SUBNHIS_P9                     DATA_SUBN01                                     9
                               SUBNHIS_P10                    DATA_SUBN02                                    10
                               SUBNHIS_P11                    DATA_SUBN03                                    11
                               SUBNHIS_P12                    DATA_SUBN04                                    12


12 rows selected.

Elapsed: 00:00:00.17
SQL>

break on TAB.IND skip 1
col table_name format a20
col index_name format a25
col partition_name format a25
col high_value format a100
set linesize 1000
select b.table_name || '.' || a.index_name "TAB.IND", a.partition_name, a.high_value,PARTITION_POSITION                                                                                                 
from user_ind_partitions a, user_ind_columns b                                                                                                                                                            
where a.index_name=b.index_name                                                                                                                                         
and b.table_name ='SUBSCRIPTION_HISTORY_BAK'                                                                                                                                    
order by 1,PARTITION_POSITION                                                                                                                                                                           
/

SQL> l
  1  select b.table_name || '.' || a.index_name "TAB.IND", a.partition_name, a.high_value,PARTITION_POSITION
  2  from user_ind_partitions a, user_ind_columns b
  3  where a.index_name=b.index_name
  4  and b.table_name ='SUBSCRIPTION_HISTORY_BAK'
  5* order by 1,PARTITION_POSITION
SQL> /

TAB.IND                                                       PARTITION_NAME            HIGH_VALUE     PARTITION_POSITION
------------------------------------------------------------- ------------------------- ---------------------------------------------------------------------------------------------------- ------------------
SUBSCRIPTION_HISTORY_BAK.IDX_SUBHISTORY_MID                   IND_SUBNHIS_MID_P1        TO_DATE(' 2004-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                  1
                                                              IND_SUBNHIS_MID_P2        TO_DATE(' 2004-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                  2
                                                              IND_SUBNHIS_MID_P3        TO_DATE(' 2004-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                  3
                                                              IND_SUBNHIS_MID_P4        TO_DATE(' 2004-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                  4
                                                              IND_SUBNHIS_MID_P5        TO_DATE(' 2004-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                  5
                                                              IND_SUBNHIS_MID_P6        TO_DATE(' 2004-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                  6
                                                              IND_SUBNHIS_MID_P7        TO_DATE(' 2004-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                  7
                                                              IND_SUBNHIS_MID_P8        TO_DATE(' 2004-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                  8
                                                              IND_SUBNHIS_MID_P9        TO_DATE(' 2004-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                  9
                                                              IND_SUBNHIS_MID_P10       TO_DATE(' 2004-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                 10
                                                              IND_SUBNHIS_MID_P11       TO_DATE(' 2004-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                 11
                                                              IND_SUBNHIS_MID_P12       TO_DATE(' 2005-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                 12

SUBSCRIPTION_HISTORY_BAK.IDX_SUBHISTORY_SERVID                IND_SUBNHIS_SERV_P1       TO_DATE(' 2004-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                  1
                                                              IND_SUBNHIS_SERV_P2       TO_DATE(' 2004-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                  2
                                                              IND_SUBNHIS_SERV_P3       TO_DATE(' 2004-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                  3
                                                              IND_SUBNHIS_SERV_P4       TO_DATE(' 2004-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                  4
                                                              IND_SUBNHIS_SERV_P5       TO_DATE(' 2004-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                  5
                                                              IND_SUBNHIS_SERV_P6       TO_DATE(' 2004-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                  6
                                                              IND_SUBNHIS_SERV_P7       TO_DATE(' 2004-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                  7
                                                              IND_SUBNHIS_SERV_P8       TO_DATE(' 2004-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                  8
                                                              IND_SUBNHIS_SERV_P9       TO_DATE(' 2004-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                  9
                                                              IND_SUBNHIS_SERV_P10      TO_DATE(' 2004-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                 10
                                                              IND_SUBNHIS_SERV_P11      TO_DATE(' 2004-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                 11
                                                              IND_SUBNHIS_SERV_P12      TO_DATE(' 2005-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                 12

SUBSCRIPTION_HISTORY_BAK.IDX_SUBHISTORY_SUBSID                IND_SUBNHIS_ID_P1         TO_DATE(' 2004-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                  1
                                                              IND_SUBNHIS_ID_P2         TO_DATE(' 2004-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                  2
                                                              IND_SUBNHIS_ID_P3         TO_DATE(' 2004-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                  3
                                                              IND_SUBNHIS_ID_P4         TO_DATE(' 2004-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                  4
                                                              IND_SUBNHIS_ID_P5         TO_DATE(' 2004-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                  5
                                                              IND_SUBNHIS_ID_P6         TO_DATE(' 2004-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                  6
                                                              IND_SUBNHIS_ID_P7         TO_DATE(' 2004-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                  7
                                                              IND_SUBNHIS_ID_P8         TO_DATE(' 2004-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                  8
                                                              IND_SUBNHIS_ID_P9         TO_DATE(' 2004-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                  9
                                                              IND_SUBNHIS_ID_P10        TO_DATE(' 2004-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                 10
                                                              IND_SUBNHIS_ID_P11        TO_DATE(' 2004-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                 11
                                                              IND_SUBNHIS_ID_P12        TO_DATE(' 2005-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                                 12


36 rows selected.

Elapsed: 00:00:00.30
SQL>
SQL> select count(*) from SUBSCRIPTION_HISTORY_BAK partition(SUBNHIS_P1);

  COUNT(*)
----------
     64475

Elapsed: 00:00:00.16
SQL> select count(*) from SUBSCRIPTION_HISTORY_BAK partition(SUBNHIS_P10);

  COUNT(*)
----------
     79949

Elapsed: 00:00:00.08
SQL> select count(*) from SUBSCRIPTION_HISTORY_BAK partition(SUBNHIS_P9);

  COUNT(*)
----------
     77370

Elapsed: 00:00:00.08
SQL>


==================================================================================================
5、建立新的历史表 SUBSCRIPTION_HISTORY
==================================================================================================
spool createTbl_CS_lunar.log

drop table SUBSCRIPTION_HISTORY;

create table SUBSCRIPTION_HISTORY (
HistoryId            NUMBER(10)                       not null,
Mid                  VARCHAR2(14) NOT NULL,
SubsId               VARCHAR2(15) NOT NULL,
ActionId             VARCHAR2(3)                      not null,
ActionDesc           VARCHAR2(100)                    not null,
ActionDate           DATE default sysdate,
ActionPlace          VARCHAR2(2),
ServId               VARCHAR2(12) NOT NULL,
ICPid                VARCHAR2(10) NOT NULL,
AccessModeId         NUMBER(7)                        not null,
ServCatId            NUMBER(4)                        not null,
ServiceGradeId       NUMBER(3) NOT NULL,
Staff_id             NUMBER(10) ,
Comments             VARCHAR2(200),
ServicePackageId VARCHAR2(8),
ChargeMid  VARCHAR2(14),
TmpFlag  NUMBER(1) DEFAULT 0,
VisitCount  NUMBER(3) DEFAULT 0,
SubnPlace  VARCHAR2(2),
SubsCat  NUMBER(3) DEFAULT 99,
ChargeSubsid         varchar2(15),
constraint FK_SUBN_REFERENCE_MISC_ACT foreign key (ActionId) references Misc_Action (Actionid)
)
PARTITION BY RANGE (ACTIONDATE)
(
PARTITION subnhis_P1 VALUES LESS THAN (to_date('2004/02/01','yyyy/mm/dd')) TABLESPACE DATA_SUBN01,
PARTITION subnhis_P2 VALUES LESS THAN (to_date('2004/03/01','yyyy/mm/dd')) TABLESPACE DATA_SUBN02,
PARTITION subnhis_P3 VALUES LESS THAN (to_date('2004/04/01','yyyy/mm/dd')) TABLESPACE DATA_SUBN03,
PARTITION subnhis_P4 VALUES LESS THAN (to_date('2004/05/01','yyyy/mm/dd')) TABLESPACE DATA_SUBN04,
PARTITION subnhis_P5 VALUES LESS THAN (to_date('2004/06/01','yyyy/mm/dd')) TABLESPACE DATA_SUBN05,
PARTITION subnhis_P6 VALUES LESS THAN (to_date('2004/07/01','yyyy/mm/dd')) TABLESPACE DATA_SUBN06,
PARTITION subnhis_P7 VALUES LESS THAN (to_date('2004/08/01','yyyy/mm/dd')) TABLESPACE DATA_SUBN07,
PARTITION subnhis_P8 VALUES LESS THAN (to_date('2004/09/01','yyyy/mm/dd')) TABLESPACE DATA_SUBN08,
PARTITION subnhis_P9 VALUES LESS THAN (to_date('2004/10/01','yyyy/mm/dd')) TABLESPACE DATA_SUBN01,
PARTITION subnhis_P10 VALUES LESS THAN (to_date('2004/11/01','yyyy/mm/dd')) TABLESPACE DATA_SUBN02,
PARTITION subnhis_P11 VALUES LESS THAN (to_date('2004/12/01','yyyy/mm/dd')) TABLESPACE DATA_SUBN03,
PARTITION subnhis_P12 VALUES LESS THAN (to_date('2005/01/01','yyyy/mm/dd')) TABLESPACE DATA_SUBN04
);

create index IDX_SUBNHISTORY_MID_lunar on SUBSCRIPTION_HISTORY (MID)
local
(                    
PARTITION ind_subnhis_mid_P1 TABLESPACE INDEX_SUBN01,
PARTITION ind_subnhis_mid_P2  TABLESPACE INDEX_SUBN02,
PARTITION ind_subnhis_mid_P3  TABLESPACE INDEX_SUBN03,
PARTITION ind_subnhis_mid_P4  TABLESPACE INDEX_SUBN04,
PARTITION ind_subnhis_mid_P5  TABLESPACE INDEX_SUBN05,
PARTITION ind_subnhis_mid_P6  TABLESPACE INDEX_SUBN06,
PARTITION ind_subnhis_mid_P7  TABLESPACE INDEX_SUBN07,
PARTITION ind_subnhis_mid_P8  TABLESPACE INDEX_SUBN08,
PARTITION ind_subnhis_mid_P9  TABLESPACE INDEX_SUBR01,
PARTITION ind_subnhis_mid_P10 TABLESPACE INDEX_SUBR02,
PARTITION ind_subnhis_mid_P11 TABLESPACE INDEX_SUBR03,
PARTITION ind_subnhis_mid_P12 TABLESPACE INDEX_SUBR04
);

create index IDX_SUBNHISTORY_SERVID_lunar on SUBSCRIPTION_HISTORY (SERVID)
local
(                    
PARTITION ind_subnhis_serv_P1 TABLESPACE INDEX_SUBN01,
PARTITION ind_subnhis_serv_P2  TABLESPACE INDEX_SUBN02,
PARTITION ind_subnhis_serv_P3  TABLESPACE INDEX_SUBN03,
PARTITION ind_subnhis_serv_P4  TABLESPACE INDEX_SUBN04,
PARTITION ind_subnhis_serv_P5  TABLESPACE INDEX_SUBN05,
PARTITION ind_subnhis_serv_P6  TABLESPACE INDEX_SUBN06,
PARTITION ind_subnhis_serv_P7  TABLESPACE INDEX_SUBN07,
PARTITION ind_subnhis_serv_P8  TABLESPACE INDEX_SUBN08,
PARTITION ind_subnhis_serv_P9  TABLESPACE INDEX_SUBR01,
PARTITION ind_subnhis_serv_P10 TABLESPACE INDEX_SUBR02,
PARTITION ind_subnhis_serv_P11 TABLESPACE INDEX_SUBR03,
PARTITION ind_subnhis_serv_P12 TABLESPACE INDEX_SUBR04
);

create index IDX_SUBNHISTORY_SUBSID_lunar on SUBSCRIPTION_HISTORY (SUBSID)
local
(                    
PARTITION ind_subnhis_id_P1 TABLESPACE INDEX_SUBN01,
PARTITION ind_subnhis_id_P2  TABLESPACE INDEX_SUBN02,
PARTITION ind_subnhis_id_P3  TABLESPACE INDEX_SUBN03,
PARTITION ind_subnhis_id_P4  TABLESPACE INDEX_SUBN04,
PARTITION ind_subnhis_id_P5  TABLESPACE INDEX_SUBN05,
PARTITION ind_subnhis_id_P6  TABLESPACE INDEX_SUBN06,
PARTITION ind_subnhis_id_P7  TABLESPACE INDEX_SUBN07,
PARTITION ind_subnhis_id_P8  TABLESPACE INDEX_SUBN08,
PARTITION ind_subnhis_id_P9  TABLESPACE INDEX_SUBR01,
PARTITION ind_subnhis_id_P10 TABLESPACE INDEX_SUBR02,
PARTITION ind_subnhis_id_P11 TABLESPACE INDEX_SUBR03,
PARTITION ind_subnhis_id_P12 TABLESPACE INDEX_SUBR04
);

create index IDX_SUBNH_CHARGESUBSID_lunar on SUBSCRIPTION_HISTORY (CHARGESUBSID)
local
(                    
PARTITION ind_subnhis_CHARGESUBSID_0501 TABLESPACE INDEX_SUBN01,
PARTITION ind_subnhis_CHARGESUBSID_0502 TABLESPACE INDEX_SUBN02,
PARTITION ind_subnhis_CHARGESUBSID_0503 TABLESPACE INDEX_SUBN03,
PARTITION ind_subnhis_CHARGESUBSID_0504 TABLESPACE INDEX_SUBN04,
PARTITION ind_subnhis_CHARGESUBSID_0505 TABLESPACE INDEX_SUBN05,
PARTITION ind_subnhis_CHARGESUBSID_0506 TABLESPACE INDEX_SUBN06,
PARTITION ind_subnhis_CHARGESUBSID_0507 TABLESPACE INDEX_SUBN07,
PARTITION ind_subnhis_CHARGESUBSID_0508 TABLESPACE INDEX_SUBN08,
PARTITION ind_subnhis_CHARGESUBSID_0509 TABLESPACE INDEX_SUBR01,
PARTITION ind_subnhis_CHARGESUBSID_0510 TABLESPACE INDEX_SUBR02,
PARTITION ind_subnhis_CHARGESUBSID_0511 TABLESPACE INDEX_SUBR03,
PARTITION ind_subnhis_CHARGESUBSID_0512 TABLESPACE INDEX_SUBR04
);

create index IDX_SUBNH_HISTORYID_lunar on SUBSCRIPTION_HISTORY (HISTORYID)
local
(                    
PARTITION ind_subnhis_HISTORYID_0501 TABLESPACE INDEX_SUBN01,
PARTITION ind_subnhis_HISTORYID_0502 TABLESPACE INDEX_SUBN02,
PARTITION ind_subnhis_HISTORYID_0503 TABLESPACE INDEX_SUBN03,
PARTITION ind_subnhis_HISTORYID_0504 TABLESPACE INDEX_SUBN04,
PARTITION ind_subnhis_HISTORYID_0505 TABLESPACE INDEX_SUBN05,
PARTITION ind_subnhis_HISTORYID_0506 TABLESPACE INDEX_SUBN06,
PARTITION ind_subnhis_HISTORYID_0507 TABLESPACE INDEX_SUBN07,
PARTITION ind_subnhis_HISTORYID_0508 TABLESPACE INDEX_SUBN08,
PARTITION ind_subnhis_HISTORYID_0509 TABLESPACE INDEX_SUBR01,
PARTITION ind_subnhis_HISTORYID_0510 TABLESPACE INDEX_SUBR02,
PARTITION ind_subnhis_HISTORYID_0511 TABLESPACE INDEX_SUBR03,
PARTITION ind_subnhis_HISTORYID_0512 TABLESPACE INDEX_SUBR04
);

spool off
exit

SQL> select count(*) from SUBSCRIPTION_HISTORY partition(SUBNHIS_P1);

  COUNT(*)
----------
         0

Elapsed: 00:00:00.03
SQL> select count(*) from SUBSCRIPTION_HISTORY partition(SUBNHIS_P10);

  COUNT(*)
----------
         0

Elapsed: 00:00:00.01
SQL> select count(*) from SUBSCRIPTION_HISTORY partition(SUBNHIS_P9);

  COUNT(*)
----------
         0

Elapsed: 00:00:00.01
SQL> select count(*) from SUBSCRIPTION_HISTORY_BAK partition(SUBNHIS_P1);

  COUNT(*)
----------
     64475

Elapsed: 00:00:00.05
SQL> select count(*) from SUBSCRIPTION_HISTORY_BAK partition(SUBNHIS_P10);

  COUNT(*)
----------
     79949

Elapsed: 00:00:00.06
SQL> select count(*) from SUBSCRIPTION_HISTORY_BAK partition(SUBNHIS_P9);

  COUNT(*)
----------
     77370

Elapsed: 00:00:00.07
SQL>


==================================================================================================
6、 建立一个容纳临时分区数据的空表: SNH_TMP_P1
==================================================================================================

drop table SNH_TMP_P1;

create table SNH_TMP_P1 (
HistoryId            NUMBER(10)                       DEFAULT 0 NOT NULL,
Mid                  VARCHAR2(14) DEFAULT 'a' NOT NULL,
SubsId               VARCHAR2(15) DEFAULT 'a' NOT NULL,
ActionId             VARCHAR2(3)                      DEFAULT 'a' NOT NULL,
ActionDesc           VARCHAR2(100)                    DEFAULT 'a' NOT NULL,
ActionDate           DATE default sysdate,
ActionPlace          VARCHAR2(2),
ServId               VARCHAR2(12) DEFAULT 'a' NOT NULL,
ICPid                VARCHAR2(10) DEFAULT 'a' NOT NULL,
AccessModeId         NUMBER(7)                        DEFAULT 0 NOT NULL,
ServCatId            NUMBER(4)                        DEFAULT 0 NOT NULL,
ServiceGradeId       NUMBER(3) DEFAULT 0 NOT NULL,
Staff_id             NUMBER(10) ,
Comments             VARCHAR2(200),
ServicePackageId VARCHAR2(8),
ChargeMid  VARCHAR2(14),
TmpFlag  NUMBER(1) DEFAULT 0,
VisitCount  NUMBER(3) DEFAULT 0,
SubnPlace  VARCHAR2(2),
SubsCat  NUMBER(3) DEFAULT 99,
ChargeSubsid         varchar2(15),
constraint FK_SNH_TMP_lunar foreign key (ActionId) references Misc_Action (Actionid)
)
/

create index IDX_SNH_TMP_MID_lunar on SNH_TMP_P1 (MID);
create index IDX_SNH_TMP_SERVID_lunar on SNH_TMP_P1 (SERVID);
create index IDX_SNH_TMP_SUBSID_lunar on SNH_TMP_P1 (SUBSID);
create index IDX_SNH_TMP_CHARGESUBSID_lunar on SNH_TMP_P1 (CHARGESUBSID);
create index IDX_SNH_TMP_HISTORYID_lunar on SNH_TMP_P1 (HISTORYID);


SQL> select count(*) from SNH_TMP_P1;

  COUNT(*)
----------
         0

Elapsed: 00:00:00.02
SQL> select count(*) from SUBSCRIPTION_HISTORY partition(SUBNHIS_P1);

  COUNT(*)
----------
         0

Elapsed: 00:00:00.04
SQL> select count(*) from SUBSCRIPTION_HISTORY_BAK partition(SUBNHIS_P1);

  COUNT(*)
----------
     64475

Elapsed: 00:00:00.07
SQL>


==================================================================================================
7、将空表和老表的第一分区(例子分区)作交换操作
==================================================================================================
alter table SUBSCRIPTION_HISTORY_BAK
exchange partition SUBNHIS_P1 with table SNH_TMP_P1
including indexes
without validation
/

SQL> alter table SUBSCRIPTION_HISTORY_BAK
  2  exchange partition SUBNHIS_P1 with table SNH_TMP_P1
  3  including indexes
  4  without validation
  5  /
exchange partition SUBNHIS_P1 with table SNH_TMP_P1
                                         *
ERROR at line 2:
ORA-14098: index mismatch for tables in ALTER TABLE EXCHANGE PARTITION


Elapsed: 00:00:00.05
SQL>
上诉错误是由于新的表(SNH_TMP_P1,5个索引)比老表(SUBSCRIPTION_HISTORY_BAK,3个local索引和1个global索引)
索引数目不匹配。

删除两个多余的索引后,该问题得到解决:
drop index IDX_SNH_TMP_HISTORYID_lunar;
drop index IDX_SNH_TMP_CHARGESUBSID_lunar;

SQL> drop index IDX_SNH_TMP_HISTORYID_lunar;

Index dropped.

Elapsed: 00:00:00.10
SQL> drop index IDX_SNH_TMP_CHARGESUBSID_lunar;

Index dropped.

Elapsed: 00:00:00.14
SQL>
SQL> alter table SUBSCRIPTION_HISTORY_BAK
  2  exchange partition SUBNHIS_P1 with table SNH_TMP_P1
  3  including indexes
  4  without validation
  5  /

Table altered.

Elapsed: 00:00:00.29
SQL>


----------------------------------------------------------------
交换分区后的数据检查:
----------------------------------------------------------------
SQL> select count(*) from SNH_TMP_P1;

  COUNT(*)
----------
     64475

Elapsed: 00:00:00.09
SQL> select count(*) from SUBSCRIPTION_HISTORY partition(SUBNHIS_P1);

  COUNT(*)
----------
         0

Elapsed: 00:00:00.02
SQL> select count(*) from SUBSCRIPTION_HISTORY_BAK partition(SUBNHIS_P1);

  COUNT(*)
----------
         0

Elapsed: 00:00:00.01
SQL>


----------------------------------------------------------------
检查分区表状态:
----------------------------------------------------------------
SQL> l
  1  select b.table_name || '.' || a.index_name "TAB.IND", a.partition_name, status,PARTITION_POSITION
  2  from user_ind_partitions a, user_ind_columns b
  3  where a.index_name=b.index_name
  4  and b.table_name IN ('SUBSCRIPTION_HISTORY_BAK','SUBSCRIPTION_HISTORY')
  5* order by 1,PARTITION_POSITION
SQL> /

TAB.IND                                                       PARTITION_NAME                 STATUS   PARTITION_POSITION
------------------------------------------------------------- ------------------------------ -------- ------------------
SUBSCRIPTION_HISTORY.IDX_SUBNHISTORY_MID_LUNAR                IND_SUBNHIS_MID_P1             USABLE                    1
                                                              IND_SUBNHIS_MID_P2             USABLE                    2
                                                              IND_SUBNHIS_MID_P3             USABLE                    3
                                                              IND_SUBNHIS_MID_P4             USABLE                    4
                                                              IND_SUBNHIS_MID_P5             USABLE                    5
                                                              IND_SUBNHIS_MID_P6             USABLE                    6
                                                              IND_SUBNHIS_MID_P7             USABLE                    7
                                                              IND_SUBNHIS_MID_P8             USABLE                    8
                                                              IND_SUBNHIS_MID_P9             USABLE                    9
                                                              IND_SUBNHIS_MID_P10            USABLE                   10
                                                              IND_SUBNHIS_MID_P11            USABLE                   11
                                                              IND_SUBNHIS_MID_P12            USABLE                   12

SUBSCRIPTION_HISTORY.IDX_SUBNHISTORY_SERVID_LUNAR             IND_SUBNHIS_SERV_P1            USABLE                    1
                                                              IND_SUBNHIS_SERV_P2            USABLE                    2
                                                              IND_SUBNHIS_SERV_P3            USABLE                    3
                                                              IND_SUBNHIS_SERV_P4            USABLE                    4
                                                              IND_SUBNHIS_SERV_P5            USABLE                    5
                                                              IND_SUBNHIS_SERV_P6            USABLE                    6
                                                              IND_SUBNHIS_SERV_P7            USABLE                    7
                                                              IND_SUBNHIS_SERV_P8            USABLE                    8
                                                              IND_SUBNHIS_SERV_P9            USABLE                    9
                                                              IND_SUBNHIS_SERV_P10           USABLE                   10
                                                              IND_SUBNHIS_SERV_P11           USABLE                   11
                                                              IND_SUBNHIS_SERV_P12           USABLE                   12

SUBSCRIPTION_HISTORY.IDX_SUBNHISTORY_SUBSID_LUNAR             IND_SUBNHIS_ID_P1              USABLE                    1
                                                              IND_SUBNHIS_ID_P2              USABLE                    2
                                                              IND_SUBNHIS_ID_P3              USABLE                    3
                                                              IND_SUBNHIS_ID_P4              USABLE                    4
                                                              IND_SUBNHIS_ID_P5              USABLE                    5
                                                              IND_SUBNHIS_ID_P6              USABLE                    6
                                                              IND_SUBNHIS_ID_P7              USABLE                    7
                                                              IND_SUBNHIS_ID_P8              USABLE                    8
                                                              IND_SUBNHIS_ID_P9              USABLE                    9
                                                              IND_SUBNHIS_ID_P10             USABLE                   10
                                                              IND_SUBNHIS_ID_P11             USABLE                   11
                                                              IND_SUBNHIS_ID_P12             USABLE                   12

SUBSCRIPTION_HISTORY.IDX_SUBNH_CHARGESUBSID_LUNAR             IND_SUBNHIS_CHARGESUBSID_0501  USABLE                    1
                                                              IND_SUBNHIS_CHARGESUBSID_0502  USABLE                    2
                                                              IND_SUBNHIS_CHARGESUBSID_0503  USABLE                    3
                                                              IND_SUBNHIS_CHARGESUBSID_0504  USABLE                    4
                                                              IND_SUBNHIS_CHARGESUBSID_0505  USABLE                    5
                                                              IND_SUBNHIS_CHARGESUBSID_0506  USABLE                    6
                                                              IND_SUBNHIS_CHARGESUBSID_0507  USABLE                    7
                                                              IND_SUBNHIS_CHARGESUBSID_0508  USABLE                    8
                                                              IND_SUBNHIS_CHARGESUBSID_0509  USABLE                    9
                                                              IND_SUBNHIS_CHARGESUBSID_0510  USABLE                   10
                                                              IND_SUBNHIS_CHARGESUBSID_0511  USABLE                   11
                                                              IND_SUBNHIS_CHARGESUBSID_0512  USABLE                   12

SUBSCRIPTION_HISTORY.IDX_SUBNH_HISTORYID_LUNAR                IND_SUBNHIS_HISTORYID_0501     USABLE                    1
                                                              IND_SUBNHIS_HISTORYID_0502     USABLE                    2
                                                              IND_SUBNHIS_HISTORYID_0503     USABLE                    3
                                                              IND_SUBNHIS_HISTORYID_0504     USABLE                    4
                                                              IND_SUBNHIS_HISTORYID_0505     USABLE                    5
                                                              IND_SUBNHIS_HISTORYID_0506     USABLE                    6
                                                              IND_SUBNHIS_HISTORYID_0507     USABLE                    7
                                                              IND_SUBNHIS_HISTORYID_0508     USABLE                    8
                                                              IND_SUBNHIS_HISTORYID_0509     USABLE                    9
                                                              IND_SUBNHIS_HISTORYID_0510     USABLE                   10
                                                              IND_SUBNHIS_HISTORYID_0511     USABLE                   11
                                                              IND_SUBNHIS_HISTORYID_0512     USABLE                   12

SUBSCRIPTION_HISTORY_BAK.IDX_SUBHISTORY_MID                   IND_SUBNHIS_MID_P1             USABLE                    1
                                                              IND_SUBNHIS_MID_P2             USABLE                    2
                                                              IND_SUBNHIS_MID_P3             USABLE                    3
                                                              IND_SUBNHIS_MID_P4             USABLE                    4
                                                              IND_SUBNHIS_MID_P5             USABLE                    5
                                                              IND_SUBNHIS_MID_P6             USABLE                    6
                                                              IND_SUBNHIS_MID_P7             USABLE                    7
                                                              IND_SUBNHIS_MID_P8             USABLE                    8
                                                              IND_SUBNHIS_MID_P9             USABLE                    9
                                                              IND_SUBNHIS_MID_P10            USABLE                   10
                                                              IND_SUBNHIS_MID_P11            USABLE                   11
                                                              IND_SUBNHIS_MID_P12            USABLE                   12

SUBSCRIPTION_HISTORY_BAK.IDX_SUBHISTORY_SERVID                IND_SUBNHIS_SERV_P1            USABLE                    1
                                                              IND_SUBNHIS_SERV_P2            USABLE                    2
                                                              IND_SUBNHIS_SERV_P3            USABLE                    3
                                                              IND_SUBNHIS_SERV_P4            USABLE                    4
                                                              IND_SUBNHIS_SERV_P5            USABLE                    5
                                                              IND_SUBNHIS_SERV_P6            USABLE                    6
                                                              IND_SUBNHIS_SERV_P7            USABLE                    7
                                                              IND_SUBNHIS_SERV_P8            USABLE                    8
                                                              IND_SUBNHIS_SERV_P9            USABLE                    9
                                                              IND_SUBNHIS_SERV_P10           USABLE                   10
                                                              IND_SUBNHIS_SERV_P11           USABLE                   11
                                                              IND_SUBNHIS_SERV_P12           USABLE                   12

SUBSCRIPTION_HISTORY_BAK.IDX_SUBHISTORY_SUBSID                IND_SUBNHIS_ID_P1              USABLE                    1
                                                              IND_SUBNHIS_ID_P2              USABLE                    2
                                                              IND_SUBNHIS_ID_P3              USABLE                    3
                                                              IND_SUBNHIS_ID_P4              USABLE                    4
                                                              IND_SUBNHIS_ID_P5              USABLE                    5
                                                              IND_SUBNHIS_ID_P6              USABLE                    6
                                                              IND_SUBNHIS_ID_P7              USABLE                    7
                                                              IND_SUBNHIS_ID_P8              USABLE                    8
                                                              IND_SUBNHIS_ID_P9              USABLE                    9
                                                              IND_SUBNHIS_ID_P10             USABLE                   10
                                                              IND_SUBNHIS_ID_P11             USABLE                   11
                                                              IND_SUBNHIS_ID_P12             USABLE                   12


96 rows selected.

Elapsed: 00:00:00.11
SQL>


---------------------------------------------------------
尝试向 SUBSCRIPTION_HISTORY_BAK 中插入结论,看看是否可行?
---------------------------------------------------------
select count(*) from SUBSCRIPTION_HISTORY_BAK partition(SUBNHIS_P1);
select count(*) from SNH_TMP_P1;

CREATE TABLE ttt as select * from SUBSCRIPTION_HISTORY_BAK where rownum<2;
select HistoryId,actiondate from ttt;
update ttt set actiondate=actiondate+5,HistoryId=9999999;
commit;
select HistoryId,actiondate from ttt;
insert into SUBSCRIPTION_HISTORY_BAK select * from ttt;


SQL> select count(*) from SUBSCRIPTION_HISTORY_BAK partition(SUBNHIS_P1);

  COUNT(*)
----------
         0

Elapsed: 00:00:00.02
SQL> select count(*) from SNH_TMP_P1;

  COUNT(*)
----------
     64475

Elapsed: 00:00:00.08
SQL> CREATE TABLE ttt as select * from SUBSCRIPTION_HISTORY_BAK where rownum<2;

Table created.

Elapsed: 00:00:00.24
SQL> select HistoryId,actiondate from ttt;

 HISTORYID ACTIONDAT
---------- ---------
        26 29-FEB-04

Elapsed: 00:00:00.03
SQL> select HistoryId,actiondate from ttt;

 HISTORYID ACTIONDAT
---------- ---------
        26 29-FEB-04

Elapsed: 00:00:00.03
SQL> update ttt set actiondate=actiondate-35,HistoryId=9999999;

1 row updated.

Elapsed: 00:00:00.02
SQL> select HistoryId,actiondate from ttt;

 HISTORYID ACTIONDAT
---------- ---------
   9999999 25-JAN-04

Elapsed: 00:00:00.00
SQL> commit;

Commit complete.

Elapsed: 00:00:00.01
SQL> insert into SUBSCRIPTION_HISTORY_BAK partition(SUBNHIS_P1) select * from ttt;
insert into SUBSCRIPTION_HISTORY_BAK partition(SUBNHIS_P1) select * from ttt
*
ERROR at line 1:
ORA-01502: index 'MISC.PK_SUBSCRIPTION_HISTORY' or partition of such index is in unusable state


Elapsed: 00:00:00.08
SQL>
  可见这个时候,由于 SUBSCRIPTION_HISTORY_BAK 表存在global index,因此所了exchange partition后,该表变为不可用的
直到global index被rebuild才可以:
alter index PK_SUBSCRIPTION_HISTORY rebuild online COMPUTE STATISTICS ;

SQL> alter index PK_SUBSCRIPTION_HISTORY rebuild online COMPUTE STATISTICS ;

Index altered.

Elapsed: 00:00:15.71
SQL> select count(*) from SUBSCRIPTION_HISTORY_BAK;

  COUNT(*)
----------
    863877

Elapsed: 00:00:00.59
SQL>


==================================================================================================
8、测试,是否可以向新表( SUBSCRIPTION_HISTORY )中插入数据
==================================================================================================
insert into SUBSCRIPTION_HISTORY partition(SUBNHIS_P1) select * from ttt;

SQL> select count(*) from SUBSCRIPTION_HISTORY;

  COUNT(*)
----------
         0

Elapsed: 00:00:00.02
SQL> insert into SUBSCRIPTION_HISTORY partition(SUBNHIS_P1) select * from ttt;

1 row created.

Elapsed: 00:00:00.09
SQL> commit;

Commit complete.

Elapsed: 00:00:00.01
SQL> select count(*) from SUBSCRIPTION_HISTORY;

  COUNT(*)
----------
         1

Elapsed: 00:00:00.02
SQL> select count(*) from SUBSCRIPTION_HISTORY partition(SUBNHIS_P1);

  COUNT(*)
----------
         1

Elapsed: 00:00:00.02
SQL>


==================================================================================================
9、测试,使新表( SUBSCRIPTION_HISTORY )和已经装满数据的单独表(SNH_TMP_P1)做交换
==================================================================================================
SQL> delete from SUBSCRIPTION_HISTORY partition(SUBNHIS_P1);

1 row deleted.

Elapsed: 00:00:00.05
SQL> commit;

Commit complete.

Elapsed: 00:00:00.02
SQL>

alter table SUBSCRIPTION_HISTORY
exchange partition SUBNHIS_P1 with table SNH_TMP_P1
including indexes
without validation
/

SQL> alter table SUBSCRIPTION_HISTORY
  2  exchange partition SUBNHIS_P1 with table SNH_TMP_P1
  3  including indexes
  4  without validation
  5  /
exchange partition SUBNHIS_P1 with table SNH_TMP_P1
                                         *
ERROR at line 2:
ORA-14098: index mismatch for tables in ALTER TABLE EXCHANGE PARTITION


Elapsed: 00:00:00.05
SQL>
   该错误是由于单独临时表( SNH_TMP_P1 )和新的分区表( SUBSCRIPTION_HISTORY )的索引数目不同,
将SNH_TMP_P1的索引和新的分区表( SUBSCRIPTION_HISTORY )的索引统一后可以解决问题:
SQL> create index IDX_SNH_TMP_CHARGESUBSID_lunar on SNH_TMP_P1 (CHARGESUBSID);

Index created.

Elapsed: 00:00:00.43
SQL> create index IDX_SNH_TMP_HISTORYID_lunar on SNH_TMP_P1 (HISTORYID);

Index created.

Elapsed: 00:00:00.49
SQL>


SQL> alter table SUBSCRIPTION_HISTORY
  2  exchange partition SUBNHIS_P1 with table SNH_TMP_P1
  3  including indexes
  4  without validation
  5  /

Table altered.

Elapsed: 00:00:00.21
SQL> select count(*) from SUBSCRIPTION_HISTORY;

  COUNT(*)
----------
     64475

Elapsed: 00:00:00.05
SQL> select count(*) from SUBSCRIPTION_HISTORY partition(SUBNHIS_P1);

  COUNT(*)
----------
     64475

Elapsed: 00:00:00.06
SQL>
SQL> select count(*) from SNH_TMP_P1;

  COUNT(*)
----------
         0

Elapsed: 00:00:00.03
SQL>

---------------------------------------------------------------
检查这时是否可以向SUBSCRIPTION_HISTORY中插入记录:
---------------------------------------------------------------
select HistoryId,actiondate from ttt;
update ttt set actiondate=actiondate+35,HistoryId=9999999;
select count(*) from SUBSCRIPTION_HISTORY partition(SUBNHIS_P2);
select HistoryId,actiondate from SUBSCRIPTION_HISTORY partition(SUBNHIS_P2) where HISTORYID='9999999';
insert into SUBSCRIPTION_HISTORY partition(SUBNHIS_P2) select * from ttt;
select count(*) from SUBSCRIPTION_HISTORY partition(SUBNHIS_P2) where HISTORYID='9999999';
select HistoryId,actiondate from SUBSCRIPTION_HISTORY partition(SUBNHIS_P2) where HISTORYID='9999999';


先测试是否可以往2月份分区插入数据(以2月份为例子):
SQL> update ttt set actiondate=actiondate+35,HistoryId=9999999;

1 row updated.

Elapsed: 00:00:00.05
SQL> select HistoryId,actiondate from ttt;

 HISTORYID ACTIONDAT
---------- ---------
   9999999 29-FEB-04

Elapsed: 00:00:00.02
SQL> select count(*) from SUBSCRIPTION_HISTORY partition(SUBNHIS_P2);

  COUNT(*)
----------
         0

Elapsed: 00:00:00.02
SQL> select HistoryId,actiondate from SUBSCRIPTION_HISTORY partition(SUBNHIS_P2) where HISTORYID='9999999';

no rows selected

Elapsed: 00:00:00.02
SQL>
SQL> insert into SUBSCRIPTION_HISTORY partition(SUBNHIS_P2) select * from ttt;

1 row created.

Elapsed: 00:00:00.09
SQL> select count(*) from SUBSCRIPTION_HISTORY partition(SUBNHIS_P2) where HISTORYID='9999999';

  COUNT(*)
----------
         1

Elapsed: 00:00:00.02
SQL> select HistoryId,actiondate from SUBSCRIPTION_HISTORY partition(SUBNHIS_P2) where HISTORYID='9999999';

 HISTORYID ACTIONDAT
---------- ---------
   9999999 29-FEB-04

Elapsed: 00:00:00.03
SQL>


再做一个测试,看看是否可以往3月份分区插入数据(以2月份为例子):
select HistoryId,actiondate from ttt;
update ttt set actiondate=actiondate+20,HistoryId=9999999;
select HistoryId,actiondate from ttt;
select count(*) from SUBSCRIPTION_HISTORY partition(SUBNHIS_P3);
select HistoryId,actiondate from SUBSCRIPTION_HISTORY partition(SUBNHIS_P3) where HISTORYID='9999999';
insert into SUBSCRIPTION_HISTORY partition(SUBNHIS_P3) select * from ttt;
select count(*) from SUBSCRIPTION_HISTORY partition(SUBNHIS_P3) where HISTORYID='9999999';
select HistoryId,actiondate from SUBSCRIPTION_HISTORY partition(SUBNHIS_P3) where HISTORYID='9999999';

SQL> select HistoryId,actiondate from ttt;

 HISTORYID ACTIONDAT
---------- ---------
   9999999 29-FEB-04

Elapsed: 00:00:00.01
SQL> update ttt set actiondate=actiondate+20,HistoryId=9999999;

1 row updated.

Elapsed: 00:00:00.02
SQL> select HistoryId,actiondate from ttt;

 HISTORYID ACTIONDAT
---------- ---------
   9999999 20-MAR-04

Elapsed: 00:00:00.01
SQL> select count(*) from SUBSCRIPTION_HISTORY partition(SUBNHIS_P3);

  COUNT(*)
----------
         0

Elapsed: 00:00:00.03
SQL> select HistoryId,actiondate from SUBSCRIPTION_HISTORY partition(SUBNHIS_P3) where HISTORYID='9999999';

no rows selected

Elapsed: 00:00:00.03
SQL> insert into SUBSCRIPTION_HISTORY partition(SUBNHIS_P3) select * from ttt;

1 row created.

Elapsed: 00:00:00.08
SQL> select count(*) from SUBSCRIPTION_HISTORY partition(SUBNHIS_P3) where HISTORYID='9999999';

  COUNT(*)
----------
         1

Elapsed: 00:00:00.01
SQL> select HistoryId,actiondate from SUBSCRIPTION_HISTORY partition(SUBNHIS_P3) where HISTORYID='9999999';

 HISTORYID ACTIONDAT
---------- ---------
   9999999 20-MAR-04

Elapsed: 00:00:00.01
SQL>


==================================================================================================
10、检查新表( SUBSCRIPTION_HISTORY )做交换后,索引的状态
==================================================================================================
SQL> l
  1  select b.table_name || '.' || a.index_name "TAB.IND", a.partition_name, status,PARTITION_POSITION
  2  from user_ind_partitions a, user_ind_columns b
  3  where a.index_name=b.index_name
  4  and b.table_name ='SUBSCRIPTION_HISTORY'
  5* order by 1,PARTITION_POSITION
SQL> /

TAB.IND                                                       PARTITION_NAME                 STATUS   PARTITION_POSITION
------------------------------------------------------------- ------------------------------ -------- ------------------
SUBSCRIPTION_HISTORY.IDX_SUBNHISTORY_MID_LUNAR                IND_SUBNHIS_MID_P1             USABLE                    1
                                                              IND_SUBNHIS_MID_P2             USABLE                    2
                                                              IND_SUBNHIS_MID_P3             USABLE                    3
                                                              IND_SUBNHIS_MID_P4             USABLE                    4
                                                              IND_SUBNHIS_MID_P5             USABLE                    5
                                                              IND_SUBNHIS_MID_P6             USABLE                    6
                                                              IND_SUBNHIS_MID_P7             USABLE                    7
                                                              IND_SUBNHIS_MID_P8             USABLE                    8
                                                              IND_SUBNHIS_MID_P9             USABLE                    9
                                                              IND_SUBNHIS_MID_P10            USABLE                   10
                                                              IND_SUBNHIS_MID_P11            USABLE                   11
                                                              IND_SUBNHIS_MID_P12            USABLE                   12

SUBSCRIPTION_HISTORY.IDX_SUBNHISTORY_SERVID_LUNAR             IND_SUBNHIS_SERV_P1            USABLE                    1
                                                              IND_SUBNHIS_SERV_P2            USABLE                    2
                                                              IND_SUBNHIS_SERV_P3            USABLE                    3
                                                              IND_SUBNHIS_SERV_P4            USABLE                    4
                                                              IND_SUBNHIS_SERV_P5            USABLE                    5
                                                              IND_SUBNHIS_SERV_P6            USABLE                    6
                                                              IND_SUBNHIS_SERV_P7            USABLE                    7
                                                              IND_SUBNHIS_SERV_P8            USABLE                    8
                                                              IND_SUBNHIS_SERV_P9            USABLE                    9
                                                              IND_SUBNHIS_SERV_P10           USABLE                   10
                                                              IND_SUBNHIS_SERV_P11           USABLE                   11
                                                              IND_SUBNHIS_SERV_P12           USABLE                   12

SUBSCRIPTION_HISTORY.IDX_SUBNHISTORY_SUBSID_LUNAR             IND_SUBNHIS_ID_P1              USABLE                    1
                                                              IND_SUBNHIS_ID_P2              USABLE                    2
                                                              IND_SUBNHIS_ID_P3              USABLE                    3
                                                              IND_SUBNHIS_ID_P4              USABLE                    4
                                                              IND_SUBNHIS_ID_P5              USABLE                    5
                                                              IND_SUBNHIS_ID_P6              USABLE                    6
                                                              IND_SUBNHIS_ID_P7              USABLE                    7
                                                              IND_SUBNHIS_ID_P8              USABLE                    8
                                                              IND_SUBNHIS_ID_P9              USABLE                    9
                                                              IND_SUBNHIS_ID_P10             USABLE                   10
                                                              IND_SUBNHIS_ID_P11             USABLE                   11
                                                              IND_SUBNHIS_ID_P12             USABLE                   12

SUBSCRIPTION_HISTORY.IDX_SUBNH_CHARGESUBSID_LUNAR             IND_SUBNHIS_CHARGESUBSID_0501  USABLE                    1
                                                              IND_SUBNHIS_CHARGESUBSID_0502  USABLE                    2
                                                              IND_SUBNHIS_CHARGESUBSID_0503  USABLE                    3
                                                              IND_SUBNHIS_CHARGESUBSID_0504  USABLE                    4
                                                              IND_SUBNHIS_CHARGESUBSID_0505  USABLE                    5
                                                              IND_SUBNHIS_CHARGESUBSID_0506  USABLE                    6
                                                              IND_SUBNHIS_CHARGESUBSID_0507  USABLE                    7
                                                              IND_SUBNHIS_CHARGESUBSID_0508  USABLE                    8
                                                              IND_SUBNHIS_CHARGESUBSID_0509  USABLE                    9
                                                              IND_SUBNHIS_CHARGESUBSID_0510  USABLE                   10
                                                              IND_SUBNHIS_CHARGESUBSID_0511  USABLE                   11
                                                              IND_SUBNHIS_CHARGESUBSID_0512  USABLE                   12

SUBSCRIPTION_HISTORY.IDX_SUBNH_HISTORYID_LUNAR                IND_SUBNHIS_HISTORYID_0501     USABLE                    1
                                                              IND_SUBNHIS_HISTORYID_0502     USABLE                    2
                                                              IND_SUBNHIS_HISTORYID_0503     USABLE                    3
                                                              IND_SUBNHIS_HISTORYID_0504     USABLE                    4
                                                              IND_SUBNHIS_HISTORYID_0505     USABLE                    5
                                                              IND_SUBNHIS_HISTORYID_0506     USABLE                    6
                                                              IND_SUBNHIS_HISTORYID_0507     USABLE                    7
                                                              IND_SUBNHIS_HISTORYID_0508     USABLE                    8
                                                              IND_SUBNHIS_HISTORYID_0509     USABLE                    9
                                                              IND_SUBNHIS_HISTORYID_0510     USABLE                   10
                                                              IND_SUBNHIS_HISTORYID_0511     USABLE                   11
                                                              IND_SUBNHIS_HISTORYID_0512     USABLE                   12


60 rows selected.

Elapsed: 00:00:00.15
SQL>

drop table user_segment_tmp;
create table user_segment_tmp nologging as select * from user_segments;
set linesize 120
BREAK ON SEGMENT_NAME SKIP 1
col TABLESPACE_NAME for a30
col SEGMENT_NAME for a30
col PARTITION_NAME for a30
SELECT /*+ RULE */ SEGMENT_NAME,PARTITION_NAME,BYTES/1024/1024 MB ,TABLESPACE_NAME
FROM user_segment_tmp WHERE SEGMENT_NAME IN ('SUBSCRIPTION_HISTORY_BAK','SUBSCRIPTION_HISTORY')
ORDER BY 1,2,3,4
/

SQL> drop table user_segment_tmp;

Table dropped.

Elapsed: 00:00:00.13
SQL> create table user_segment_tmp nologging as select * from user_segments;

Table created.

Elapsed: 00:00:00.38
SQL>
SQL> l
  1  SELECT /*+ RULE */ SEGMENT_NAME,PARTITION_NAME,BYTES/1024/1024 MB ,TABLESPACE_NAME
  2  FROM user_segment_tmp WHERE SEGMENT_NAME IN ('SUBSCRIPTION_HISTORY_BAK','SUBSCRIPTION_HISTORY')
  3* ORDER BY 1,2,3,4
SQL> /

SEGMENT_NAME                   PARTITION_NAME                         MB TABLESPACE_NAME
------------------------------ ------------------------------ ---------- ------------------------------
SUBSCRIPTION_HISTORY           SUBNHIS_P1                        7.90625 DATA_SUBN01
                               SUBNHIS_P10                             4 DATA_SUBN02
                               SUBNHIS_P11                             4 DATA_SUBN03
                               SUBNHIS_P12                             4 DATA_SUBN04
                               SUBNHIS_P2                              4 DATA_SUBN02
                               SUBNHIS_P3                              4 DATA_SUBN03
                               SUBNHIS_P4                              4 DATA_SUBN04
                               SUBNHIS_P5                              4 DATA_SUBN05
                               SUBNHIS_P6                              4 DATA_SUBN06
                               SUBNHIS_P7                              4 DATA_SUBN07
                               SUBNHIS_P8                              4 DATA_SUBN08
                               SUBNHIS_P9                        7.90625 DATA_SUBN01

SUBSCRIPTION_HISTORY_BAK       SUBNHIS_P1                              4 DATA_DYNAMIC
                               SUBNHIS_P10                             8 DATA_SUBN02
                               SUBNHIS_P11                             8 DATA_SUBN03
                               SUBNHIS_P12                             8 DATA_SUBN04
                               SUBNHIS_P2                              4 DATA_SUBN02
                               SUBNHIS_P3                              8 DATA_SUBN03
                               SUBNHIS_P4                              8 DATA_SUBN04
                               SUBNHIS_P5                              8 DATA_SUBN05
                               SUBNHIS_P6                              8 DATA_SUBN06
                               SUBNHIS_P7                              8 DATA_SUBN07
                               SUBNHIS_P8                              8 DATA_SUBN08
                               SUBNHIS_P9                        7.90625 DATA_SUBN01


24 rows selected.

Elapsed: 00:00:00.02
SQL>

看到,老表中和临时表作交换的分区的表空间已经变化到DATA_DYNAMIC了,
因此,可以在老表每次做完exchange后,将空的分区drop 掉:
SQL> ALTER TABLE SUBSCRIPTION_HISTORY_BAK DROP PARTITION SUBNHIS_P1;

Table altered.

Elapsed: 00:00:00.26
SQL>


drop table user_segment_tmp;
create table user_segment_tmp nologging as select * from user_segments;
set linesize 120
BREAK ON SEGMENT_NAME SKIP 1
col TABLESPACE_NAME for a30
col SEGMENT_NAME for a30
col PARTITION_NAME for a30
SELECT /*+ RULE */ SEGMENT_NAME,PARTITION_NAME,BYTES/1024/1024 MB ,TABLESPACE_NAME
FROM user_segment_tmp WHERE SEGMENT_NAME IN ('SUBSCRIPTION_HISTORY_BAK','SUBSCRIPTION_HISTORY')
ORDER BY 1,2,3,4
/

SQL> drop table user_segment_tmp;

Table dropped.

Elapsed: 00:00:00.13
SQL> create table user_segment_tmp nologging as select * from user_segments;

Table created.

Elapsed: 00:00:00.38
SQL>
SQL> L
  1  SELECT /*+ RULE */ SEGMENT_NAME,PARTITION_NAME,BYTES/1024/1024 MB ,TABLESPACE_NAME
  2  FROM user_segment_tmp WHERE SEGMENT_NAME IN ('SUBSCRIPTION_HISTORY_BAK','SUBSCRIPTION_HISTORY')
  3* ORDER BY 1,2,3,4
SQL> /

SEGMENT_NAME                   PARTITION_NAME                         MB TABLESPACE_NAME
------------------------------ ------------------------------ ---------- ------------------------------
SUBSCRIPTION_HISTORY           SUBNHIS_P1                        7.90625 DATA_SUBN01
                               SUBNHIS_P10                             4 DATA_SUBN02
                               SUBNHIS_P11                             4 DATA_SUBN03
                               SUBNHIS_P12                             4 DATA_SUBN04
                               SUBNHIS_P2                              4 DATA_SUBN02
                               SUBNHIS_P3                              4 DATA_SUBN03
                               SUBNHIS_P4                              4 DATA_SUBN04
                               SUBNHIS_P5                              4 DATA_SUBN05
                               SUBNHIS_P6                              4 DATA_SUBN06
                               SUBNHIS_P7                              4 DATA_SUBN07
                               SUBNHIS_P8                              4 DATA_SUBN08
                               SUBNHIS_P9                        7.90625 DATA_SUBN01

SUBSCRIPTION_HISTORY_BAK       SUBNHIS_P10                             8 DATA_SUBN02
                               SUBNHIS_P11                             8 DATA_SUBN03
                               SUBNHIS_P12                             8 DATA_SUBN04
                               SUBNHIS_P2                              4 DATA_SUBN02
                               SUBNHIS_P3                              8 DATA_SUBN03
                               SUBNHIS_P4                              8 DATA_SUBN04
                               SUBNHIS_P5                              8 DATA_SUBN05
                               SUBNHIS_P6                              8 DATA_SUBN06
                               SUBNHIS_P7                              8 DATA_SUBN07
                               SUBNHIS_P8                              8 DATA_SUBN08
                               SUBNHIS_P9                        7.90625 DATA_SUBN01


23 rows selected.

Elapsed: 00:00:00.03
SQL>

对于每一个分区空间依次交换,如果没有global index,分别rebuild后就完全正常了。如果存在global index,还需要做改索引的rebuild。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值