A non-partitioned table can be Partitioned (without having to use DBMS_REDEFINITION) online.
I was able to convert a Non-Partitioned Table to a Range-Partitioned Table online.
.
.
.
There was a question in the Comments about the Object_ID. The table actually now consists of *multiple* objects (the Partitions) each with it's own Object_ID.
(You can search this blog for "DATA_OBJECT_ID" being different from OBJECT_ID. See this earlier post.)
SQL> connect hr/Oracle_4U@PDB1
Connected.
SQL> select count(*) from employees;
COUNT(*)
----------
107
SQL> create table employees_part as select * from employees;
Table created.
SQL> select table_name from user_part_tables;
no rows selected
SQL> alter table employees_part
2 modify
3 partition by range (last_name)
4 (partition p_N values less than ('O'),
5 partition p_Q values less than ('R'),
6 partition p_LAST values less than (MAXVALUE))
7 online;
Table altered.
SQL>
SQL> select partition_name, high_value
2 from user_tab_partitions
3 where table_name = 'EMPLOYEES_PART'
4 order by partition_position
5 /
PARTITION_NAME
--------------------------------------------------------------------------------
HIGH_VALUE
------------
P_N
'O'
P_Q
'R'
P_LAST
MAXVALUE
SQL>
SQL> select table_name, partitioning_type, partition_count
2 from user_part_tables
3 where table_name = 'EMPLOYEES_PART'
4 /
TABLE_NAME
--------------------------------------------------------------------------------
PARTITION PARTITION_COUNT
--------- ---------------
EMPLOYEES_PART
RANGE 3
SQL>
SQL> select partition_name, num_rows
2 from user_tab_partitions
3 where table_name = 'EMPLOYEES_PART'
4 order by partition_position
5 /
PARTITION_NAME
--------------------------------------------------------------------------------
NUM_ROWS
----------
P_N
71
P_Q
10
P_LAST
26
SQL>
I was able to convert a Non-Partitioned Table to a Range-Partitioned Table online.
.
.
.
There was a question in the Comments about the Object_ID. The table actually now consists of *multiple* objects (the Partitions) each with it's own Object_ID.
SQL> REM This test in 19c 19.3. I expect the same behaviour in 12.2.0.1
SQL> create table employees_part as select * from employees;
Table created.
SQL> select object_id, data_object_id from user_objects
2 where object_name = 'EMPLOYEES_PART';
OBJECT_ID DATA_OBJECT_ID
---------- --------------
73228 73228
SQL> alter table employees_part
2 modify
3 partition by range (last_name)
4 (partition p_N values less than ('O'),
5 partition p_Q values less than ('R'),
6 partition p_LAST values less than (MAXVALUE));
Table altered.
SQL> select object_id, data_object_id, subobject_name
2 from user_objects
3 where object_name = 'EMPLOYEES_PART'
4 order by 1,2
5 /
OBJECT_ID DATA_OBJECT_ID SUBOBJECT_NAME
---------- -------------- ------------------
73228
73233 73233 P_N
73234 73234 P_Q
73235 73235 P_LAST
SQL>
(You can search this blog for "DATA_OBJECT_ID" being different from OBJECT_ID. See this earlier post.)
3 comments:
No more exchange partition headeches. That's cool!
Does it change the Object ID of the table?. As that can affect replication so wanted to confirm..
Unknown,
I've updated this BlogPost to show the OBJECT_ID and DATA_OBJECT_ID when you partition a Table.
Post a Comment