Question

All our Oracle 10g tables have a primary key called business date of type DATE. Tables already have partitioned till 31-Jan-2014.Using above business date column,I need to partition it for the remaining 11 months of 2014, Could you please advise me which approach should I take from the ones listed below?

1.

ALTER TABLE NRGPC.MY_TABLE SPLIT PARTITION MY_TABLE_DEFAULT AT (TO_DATE('02/01/2014', 'MM/DD/YYYY')) 
    INTO (PARTITION MY_TABLE_PRT0214 TABLESPACE NRGPC_DATA, PARTITION MY_TABLE_DEFAULT ) UPDATE INDEXES;
ANALYZE TABLE NRGPC.MY_TABLE PARTITION (MY_TABLE_PRT0214 ) COMPUTE STATISTICS;

ALTER TABLE NRGPC.MY_TABLE SPLIT PARTITION MY_TABLE_DEFAULT AT (TO_DATE('03/01/2014', 'MM/DD/YYYY')) 
    INTO (PARTITION MY_TABLE_PRT0314 TABLESPACE NRGPC_DATA, PARTITION MY_TABLE_DEFAULT ) UPDATE INDEXES;
ANALYZE TABLE NRGPC.MY_TABLE PARTITION (MY_TABLE_PRT0314) COMPUTE STATISTICS;

. . . And likewise...

OR

2.

PCTUSED 40 PCTFREE 20
PARTITION BY RANGE (BUSINESS_DT) 
(  
  PARTITION MY_TABLE_2014_02 VALUES LESS THAN (TO_DATE(' 2014-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    TABLESPACE NRGPC_DATA
    PCTFREE 0,  

  PARTITION MY_TABLE_2014_03 VALUES LESS THAN (TO_DATE(' 2014-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    TABLESPACE NRGPC_DATA
    PCTFREE 0,  

. . . And likewise...

Thanks for your help.

Was it helpful?

Solution

If you already have default partition you need to split it at desirable points:

SQL> create table t (x date primary key)
  2  partition by range(x) (
  3  partition p_201312 values less than (to_date('20140101','YYYYMMDD')),
  4  partition p_default values less than (maxvalue)
  5  )
  6  /

SQL> alter table t split partition p_default at(to_date('20140201','YYYYMMDD'))
  2  into (partition p_201401, partition p_default)
  3  /

SQL> select partition_name, high_value from user_tab_partitions
  2  where table_name = 'T';

PARTITION_NAME                                                                  
--------------------------------------------------------------------------------
HIGH_VALUE                                                                      
--------------------------------------------------------------------------------
P_201312                                                                        
TO_DATE(' 2014-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA

P_201401                                                                        
TO_DATE(' 2014-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA

P_DEFAULT                                                                       
MAXVALUE  

Your second statement is used in CREATE TABLE statement when partition method and initial partition set is to be described. Please take into account that if your default partition is not empty you may need to re-create indexes after split (or use UPDATE INDEXES option).

Also if you want to add partition in the moddle of range (between min and max values) you will need to split partition with bound nearest to split point rather than default one:

SQL> create table t (x int, y int)
  2  partition by range (y) (
  3  partition p_0 values less than(1),
  4  partition p_1 values less than(2),
  5  partition p_2 values less than(3),
  6  partition p_3 values less than(4),
  7  partition p_d values less than(maxvalue)
  8  )
  9  /

SQL> alter table t drop partition p_2
  2  /

SQL> alter table t split partition p_d at(3)
  2  into (partition p_2, partition p_d)
  3  /
alter table t split partition p_d at(3)
                              *
error in line 1:
ORA-14080: Partition cannot be split along the specified high bound



SQL> select partition_name, high_value
  2  from user_tab_partitions where table_name = 'T';

PARTITION_NAME                                                                  
--------------------------------------------------------------------------------
HIGH_VALUE                                                                      
--------------------------------------------------------------------------------
P_0                                                                             
1                                                                               

P_1                                                                             
2                                                                               

P_3                                                                             
4                                                                               

P_D                                                                             
MAXVALUE                                                                        


SQL> alter table t split partition p_3 at(3)
  2  into (partition p_2, partition p_3)
  3  /


SQL> select partition_name, high_value
  2  from user_tab_partitions where table_name = 'T';

PARTITION_NAME                                                                  
--------------------------------------------------------------------------------
HIGH_VALUE                                                                      
--------------------------------------------------------------------------------
P_D                                                                             
MAXVALUE                                                                        

P_3                                                                             
4                                                                               

P_2                                                                             
3                                                                               

P_1                                                                             
2                                                                               

P_0                                                                             
1  
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top