基于dba_objects创建一个测试表t,并测试数据分布情况.
5个hash分区时:(4<5<8的分区数)
SQL> exec hash_proc(5,:x); PL/SQL procedure successfully completed. PN CNT HG -- ---------- -------------------------------- p1 9523 *************** p2 18770 ***************************** p3 19024 ****************************** p4 18706 ***************************** p5 9322 **************
查询五个分区的object_id的hash值:
SELECT partition_name pname, partition_position pos FROM user_tab_partitions WHERE table_name = 'T' ORDER BY partition_position;
PNAME POS ------------------------------ ---------- SYS_P87 1 SYS_P88 2 SYS_P89 3 SYS_P90 4 SYS_P91 5
select ora_hash(object_id,7,0)+1,count(*) from t PARTITION (SYS_P87) group by ora_hash(object_id,7,0)+1 union all
select ora_hash(object_id,7,0)+1,count(*) from t PARTITION (SYS_P88) group by ora_hash(object_id,7,0)+1 union all
select ora_hash(object_id,7,0)+1,count(*) from t PARTITION (SYS_P89) group by ora_hash(object_id,7,0)+1 union all
select ora_hash(object_id,7,0)+1,count(*) from t PARTITION (SYS_P90) group by ora_hash(object_id,7,0)+1 union all
select ora_hash(object_id,7,0)+1,count(*) from t PARTITION (SYS_P91) group by ora_hash(object_id,7,0)+1;
1对应SYS_P87;
2,6对应SYS_P88;
3,7对应SYS_P89;
4,8对应SYS_P90;
5对应SYS_P91.
ORA_HASH(OBJECT_ID,7,0)+1 COUNT(*) ------------------------- ---------- 1 9523 6 9274 2 9496 7 9514 3 9510 4 9363 8 9343 5 9322
此时添加一个hash分区:
alter table t add partition t_hash_p6;
再次检查数据分布.
SYS_P88分出了新的分区t_hash_p6;
PN CNT HG -- ---------- ------------------------------- p1 9523 *************** p2 9496 *************** p3 19024 ****************************** p4 18706 ***************************** p5 9322 ************** p6 9274 **************
再添加一个分区
alter table t add partition t_hash_p7;
再次检查数据分布.
SYS_P89分出了新的分区t_hash_p7.
PN CNT HG -- ---------- ------------------------------ p1 9523 *************** p2 9496 *************** p3 9510 *************** p4 18706 ****************************** p5 9322 *************** p6 9274 *************** p7 9514 ***************
当再次添加个新的分区后,变为8个分区,表数据终于均衡分布了.
SQL> exec hash_proc_2(:x); PL/SQL procedure successfully completed. PN CNT HG -- ---------- -------------------------------- p1 9523 ****************************** p2 9496 ****************************** p3 9510 ****************************** p4 9363 ***************************** p5 9322 ***************************** p6 9274 ***************************** p7 9514 ****************************** p8 9343 *****************************
如果coalesce partition,也是按照上面的hash值的分配进行拆分分区了.这样在添加一个分区或者合并分区时,数据在重新分布时,io的消耗就很低了.