hash partition 平衡分布数据的测试(二)

2014-11-24 18:43:11 · 作者: · 浏览: 1
SH_T SYS_P30 USERS 25209 43
HASH_T SYS_P31 USERS 24890 43


4. 插入 partition key 为7887 的 数据到分区表中


--在做一下测试看一下是否真的均匀分配
dexter@ORCL> select * from hash_t partition (sys_p29) where rownum <2 ;


ID
----------
7887
--插入一些id=7887 的数据 到分区表中
dexter@ORCL> insertinto hash_t select 7887 from dual connect by level <= 100000 ;


100000rows created.


dexter@ORCL>commit ;


Commitcomplete.
--再来分析一下
dexter@ORCL> execdbms_stats.gather_table_stats('dexter','hash_t',cascade=>true);


PL/SQLprocedure successfully completed.


--可以看到数据只分布到了sys_p29这个分区里面,也就是说当partition key 经过hash function 运算后放在了某一分区后,那么相同的partition key 的row就会在同一分区里面 , partition key 不会跨分区
--所以说hash partition 在每个partition 之间均匀分布数据也不是绝对的 , 因此最好不要使用 基数较低的 column 作为partition column
dexter@ORCL> select TABLE_NAME, PARTITION_NAME, TABLESPACE_NAME ,NUM_ROWS , BLOCKS fromuser_tab_partitions ;


TABLE_NAMEPARTITION_NAME TABLESPACE_NAME NUM_ROWS BLOCKS
---------- ------------------------------ ---------------------------------------- ----------
HASH_T SYS_P29 USERS 124956 244
HASH_T SYS_P28 USERS 24945 43
HASH_T SYS_P30 USERS 25209 43
HASH_T SYS_P31 USERS 24890 43


5. 再次验证测试结果
--再来测试一下其他情况的数据是否均匀分配
--清空数据
dexter@ORCL> truncate table hash_t ;


Tabletruncated.


dexter@ORCL>exec dbms_stats.gather_table_stats('dexter','hash_t',cascade=>true);


PL/SQLprocedure successfully completed.


dexter@ORCL>select TABLE_NAME, PARTITION_NAME, TABLESPACE_NAME , NUM_ROWS , BLOCKS from user_tab_partitions ;


TABLE_NAMEPARTITION_NAME TABLESPACE_NAME NUM_ROWS BLOCKS
---------- ------------------------------ ---------------------------------------- ----------
HASH_T SYS_P29 USERS 0 0
HASH_T SYS_P28 USERS 0 0
HASH_T SYS_P30 USERS 0 0
HASH_T SYS_P31 USERS 0 0


--初始化数据,id值只有 1,2,3
dexter@ORCL> insert into hash_t selectmod(level,3) from dual connect by level <= 100000 ;


100000rows created.


dexter@ORCL> commit ;


Commitcomplete.


dexter@ORCL>execdbms_stats.gather_table_stats('dexter','hash_t',cascade=>true);


PL/SQLprocedure successfully completed.


--可以看到,因为partitionkey 无法跨 分区 , 所以只有三个分区里面拥有数据
dexter@ORCL> select TABLE_NAME, PARTITION_NAME, TABLESPACE_NAME ,NUM_ROWS , BLOCKS fromuser_tab_partitions ;


TABLE_NAMEPARTITION_NAME TABLESPACE_NAME NUM_ROWS BLOCKS
---------- ------------------------------ ---------------------------------------- ----------
HASH_T SYS_P29 USERS 33333 58
HASH_T SYS_P28 USERS 0 0
HASH_T SY