详述Oracle 11g中的Reference Partition(二)

2015-07-16 12:08:14 · 作者: · 浏览: 1
? ? ? ? ? ? ? ? ? ? ? ? ? 2


P3? ? ? ? ? ? ? ? ? default? ? ? ? ? ? ? ? ? ? ? ? ? 3


SQL> select partition_name, high_value, partition_position from dba_tab_partitions where table_owner='SYS' and table_name='T_DETAIL';


PARTITION_NAME? ? ? HIGH_VALUE? ? ? PARTITION_POSITION


-------------------- --------------- ------------------


P0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1


P1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2


P3? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3


注意两点:子表t_detail的high_value列为空,说明该数据表并没有一个明确的分区键,主表分区键owner在子表中也不存在。另外,子表分区结构、数量和名称与主表完全相同。


从段结构segment上,我们可以看到11g的defered segment creation并没有应用。


SQL> select segment_name, partition_name, segment_type from dba_segments where owner='SYS' and segment_name in ('T_MASTER','T_DETAIL');


SEGMENT_NAME? ? PARTITION_NAME? ? ? SEGMENT_TYPE


--------------- -------------------- ----------------------


T_MASTER? ? ? ? P3? ? ? ? ? ? ? ? ? TABLE PARTITION


T_MASTER? ? ? ? P1? ? ? ? ? ? ? ? ? TABLE PARTITION


T_MASTER? ? ? ? P0? ? ? ? ? ? ? ? ? TABLE PARTITION


T_DETAIL? ? ? ? P3? ? ? ? ? ? ? ? ? TABLE PARTITION


T_DETAIL? ? ? ? P1? ? ? ? ? ? ? ? ? TABLE PARTITION


T_DETAIL? ? ? ? P0? ? ? ? ? ? ? ? ? TABLE PARTITION


6 rows selected


3、数据插入实验


下面进行数据插入和分区分布实验。首先进行主表数据插入:


SQL> insert into t_master select object_id, owner, object_name, object_type from dba_objects;


120361 rows inserted


SQL> commit;


Commit complete


SQL> exec dbms_stats.gather_table_stats(user,'T_MASTER',cascade => true);


PL/SQL procedure successfully completed


子表数据插入:


SQL> insert into t_detail select seq_t_detail.nextval, object_id, object_name, object_type from dba_objects where object_name not in?


('SEQ_T_DETAIL');


120361 rows inserted


SQL> commit;


Commit complete


SQL> exec dbms_stats.gather_table_stats(user,'T_DETAIL',cascade => true);


PL/SQL procedure successfully completed


按照当前的数据关系,应该是一条主表记录,对应一条子表记录的关系。我们检查数据字典情况。


SQL> select table_name, partition_name, high_value,num_rows from dba_tab_partitions where table_owner='SYS' and table_name in ('T_MASTER');


TABLE_NAME? ? ? ? PARTITION_NAME? ? ? HIGH_VALUE? ? ? ? NUM_ROWS


------------------------------ -------------------- --------------- ----------


T_MASTER? ? ? ? ? P0? ? ? ? ? ? ? ? ? 'PUBLIC'? ? ? ? ? ? 33996


T_MASTER? ? ? ? ? P1? ? ? ? ? ? ? ? ? 'SYS'? ? ? ? ? ? ? ? 37817


T_MASTER? ? ? ? ? P3? ? ? ? ? ? ? ? ? default? ? ? ? ? ? ? 48548


SQL> select table_name, partition_name, high_value,num_rows from dba_tab_partitions where table_owner='SYS' and table_name in ('T_DETAIL');


TABLE_NAME? ? ? ? PARTITION_NAME? ? ? HIGH_VALUE? ? ? ? NUM_ROWS


------------------------------ -------------------- --------------- ----------


T_DETAIL? ? ? ? ? P0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 33996


T_DETAIL? ? ? ? ? P1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 37817


T_DETAIL? ? ? ? ? P3? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 48548


数据分布正确。说明:子表分区分布的依据完全在于主表记录对应的分区编号。相同主表分区记录对应的子表记录,一定在相同的子表分区上。不同主表分区记录对应的子表记录,不可能在相同的子表分区上。


为便于实验,多插入一些数据:


SQL> insert into t_detail select seq_t_detail.nextval, object_id, object_name, object_type from dba_objects where object_name not in?


('SEQ_T_DETAIL');


120361 rows inserted


SQL> commit;


Commit complete


SQL> exec dbms_stats.gather_table_stats(user,'T_DETAIL',cascade => true);


PL/SQL procedure successfully completed


SQL> select table_name, partition_name, high_value,num_rows from dba_tab_partitions where table_owner='SYS' and table_name in ('T_DETAIL');


TABLE_NAME? ? PARTITION_NAME? ? ? HIGH_VALUE? ? ? ? NUM_ROWS


------------------------------ -------------------- --------------- ----------


T_DETAIL? ? ? P0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 67992


T_DET