Oracle allows Composite Partitioning where a Partition can, itself, be Sub-Partitioned. Each SubPartition is a distinct segment (allocation of physical Oracle Data blocks) while the Partition itself remains a logical definition without a segment.
Composite Partitioning can comprise of :
Here is one example of Range-List Partitioning :
SQL> drop table my_sales_table; Table dropped. SQL>
Note how the actual SubPartition Names are auto-created by Oracle using the composite of the Partition Name (P_2018, P_2019) and the SubPartition Name (from the SubPartition Template).
In this case, the names that are SubPartition in USER_TAB_SUBPARTITIONS appear as PARTITION_NAME in USER_SEGMENTS because each of the two logical Partitions (P_2018, P_2019) don't actually have their own Segments.
Note : I set "deferred_segment_creation" to FALSE so that all the Segments would be created upfront even if they are not populated. "deferred_segment_creation" is an 11g feature.
Composite Partitioning can comprise of :
- Range-Hash
- Range-List
- Range-Range
- List-Range
- List-Hash
- List-List
- Interval-Hash
- Interval-List
- Interval-Range
Here is one example of Range-List Partitioning :
SQL> drop table my_sales_table; Table dropped. SQL>
SQL> alter session set deferred_segment_creation=FALSE; Session altered. SQL> SQL> l 1 create table my_sales_table 2 (invoice_id number(16) primary key, 3 invoice_date date, 4 region_code varchar2(5), 5 invoice_amount number) 6 partition by range (invoice_date) 7 subpartition by list (region_code) 8 subpartition template 9 ( 10 subpartition US values ('US') tablespace tbs_US, 11 subpartition EMEA values ('EMEA') tablespace tbs_EMEA, 12 subpartition ASIA values ('ASIA') tablespace tbs_ASIA, 13 subpartition OTHERS values (DEFAULT) tablespace tbs_OTHERS) 14 ( 15 partition p_2018 values less than (to_date('01-JAN-2019','DD-MON-YYYY')), 16 partition p_2019 values less than (to_date('01-JAN-2020','DD-MON-YYYY')) 17* ) SQL> / Table created. SQL> SQL> select table_name, partition_name, subpartition_name 2 from user_tab_subpartitions 3 where table_name = 'MY_SALES_TABLE' 4 / TABLE_NAME PARTITION_NAME SUBPARTITION_NAME ------------------------------ --------------- ------------------------------ MY_SALES_TABLE P_2018 P_2018_US MY_SALES_TABLE P_2018 P_2018_EMEA MY_SALES_TABLE P_2018 P_2018_ASIA MY_SALES_TABLE P_2018 P_2018_OTHERS MY_SALES_TABLE P_2019 P_2019_US MY_SALES_TABLE P_2019 P_2019_EMEA MY_SALES_TABLE P_2019 P_2019_ASIA MY_SALES_TABLE P_2019 P_2019_OTHERS 8 rows selected. SQL> SQL> l 1 select segment_name, segment_type, partition_name, tablespace_name 2 from user_segments 3 where segment_name = 'MY_SALES_TABLE' 4* order by 1,2,3 SQL> / SEGMENT_NAME SEGMENT_TYPE PARTITION_NAME TABLESPACE_N --------------- ------------------ --------------- ------------ MY_SALES_TABLE TABLE SUBPARTITION P_2018_ASIA TBS_ASIA MY_SALES_TABLE TABLE SUBPARTITION P_2018_EMEA TBS_EMEA MY_SALES_TABLE TABLE SUBPARTITION P_2018_OTHERS TBS_OTHERS MY_SALES_TABLE TABLE SUBPARTITION P_2018_US TBS_US MY_SALES_TABLE TABLE SUBPARTITION P_2019_ASIA TBS_ASIA MY_SALES_TABLE TABLE SUBPARTITION P_2019_EMEA TBS_EMEA MY_SALES_TABLE TABLE SUBPARTITION P_2019_OTHERS TBS_OTHERS MY_SALES_TABLE TABLE SUBPARTITION P_2019_US TBS_US 8 rows selected. SQL>
Note how the actual SubPartition Names are auto-created by Oracle using the composite of the Partition Name (P_2018, P_2019) and the SubPartition Name (from the SubPartition Template).
In this case, the names that are SubPartition in USER_TAB_SUBPARTITIONS appear as PARTITION_NAME in USER_SEGMENTS because each of the two logical Partitions (P_2018, P_2019) don't actually have their own Segments.
Note : I set "deferred_segment_creation" to FALSE so that all the Segments would be created upfront even if they are not populated. "deferred_segment_creation" is an 11g feature.
2 comments:
Hi Hemant,
I'm suppose, we should not call Oracle blocks physical. They're actually logical representation of the database level, and we aren't certain about how the data is stored on the physical drive.
Unknown : I take your point. The mapping between an Oracle Data Block and the FileSystem BlockSize or Disk SectorSize is not 1:1 so an Oracle Data Block is a logical overlay over the physical drive.
I've updated the first paragraph.
Post a Comment