在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
Hash分区是通过对分区键运用Hash算法从而决定数据的分区归属。使用Hash分区有什么优点呢? 常用的分区表所具有的优点:如提高数据可用行,减少管理负担,改善语句性能等优点,hash分区同样拥有。此外,由于Hash分区表是按分区键的hash计算结果来决定其分区的,而特定的分区键其hash值是固定的,也就是说Hash分区表的数据是按分区键值来聚集的,同样的分区键肯定在同一分区。 复制代码 代码如下: create table equity ( id number, trade_date date, ……); Equity表可能会很大,对equity表的查询通常都是指定id,查询某一交易日期或者某段时期内的其他信息。这种情况下我们需要如何为equity表选择分区呢? Hash分区表的扩展: Hash分区表是通过add partition命令来增加分区的。Oracle推荐分区的个数是2的幂,比如,2,4,8..等等,这样可以确保数据在各个分区中分布比较均匀。当然,如前所述,还需要分区键值是连续分布的,或接近连续分布。 复制代码 代码如下: select TABLE_NAME,PARTITION_POSITION,PARTITION_NAME,NUM_ROWS from user_tab_partitions where table_name=\'COMMODITY\' order by PARTITION_POSITION; TABLE_NAME PARTITION_POSITION PARTITION_NAME NUM_ROWS -------------- ------------------ ---------------------- ---------- COMMODITY 1 COT_IND01_P1 4405650 COMMODITY 2 COT_IND01_P2 5046650 COMMODITY 3 COT_IND01_P3 5107550 …… COMMODITY 36 COT_IND01_P36 5718800 COMMODITY 37 COT_IND01_P37 9905200 COMMODITY 38 COT_IND01_P38 10118400 COMMODITY 39 COT_IND01_P39 10404950 COMMODITY 40 COT_IND01_P40 9730850 COMMODITY 41 COT_IND01_P41 9457300 COMMODITY 42 COT_IND01_P42 9717950 COMMODITY 43 COT_IND01_P43 9643900 COMMODITY 44 COT_IND01_P44 11138000 COMMODITY 45 COT_IND01_P45 9381300 COMMODITY 46 COT_IND01_P46 10101150 COMMODITY 47 COT_IND01_P47 8809950 COMMODITY 48 COT_IND01_P48 10611050 COMMODITY 49 COT_IND01_P49 10010600 COMMODITY 50 COT_IND01_P50 8252600 COMMODITY 51 COT_IND01_P51 9709900 COMMODITY 52 COT_IND01_P52 8983200 COMMODITY 53 COT_IND01_P53 9012750 COMMODITY 54 COT_IND01_P54 9310650 COMMODITY 55 COT_IND01_P55 8966450 COMMODITY 56 COT_IND01_P56 8832650 COMMODITY 57 COT_IND01_P57 9470600 COMMODITY 58 COT_IND01_P58 8932450 COMMODITY 59 COT_IND01_P59 9994850 COMMODITY 60 COT_IND01_P60 9617450 COMMODITY 61 COT_IND01_P61 10278850 COMMODITY 62 COT_IND01_P62 9277600 COMMODITY 63 COT_IND01_P63 8136300 COMMODITY 64 COT_IND01_P64 10064600 COMMODITY 65 COT_IND01_P65 3710900 …… COMMODITY 99 COT_IND01_P99 5273800 COMMODITY 100 COT_IND01_P100 5293350 100 rows selected. 查询各个分区的数据分布,我们可以看到,从分区37 ~ 64的28个分区的记录数大概是其他分区的两倍。由于100不是2的整数幂,所以Oracle的hash函数是无法保证数据是平均分布的。我们为该表添加一个新的分区COT_IND01_P101: 复制代码 代码如下: alter table nts_commodity_ts add partition COT_IND01_P101; Table altered. Elapsed: 00:06:58.52 收集统计信息后查询新的分区记录数: 复制代码 代码如下: select TABLE_NAME,PARTITION_POSITION,PARTITION_NAME,NUM_ROWS from user_tab_partitions where table_name=\'COMMODITY\' and partition_name in (\'COT_IOT_IND01_P37\',\'COT_IOT_IND01_P101\'); TABLE_NAME PARTITION_POSITION PARTITION_NAME NUM_ROWS ------------------ ------------------ --------------------- ---------- COMMODITY 37 COT__IND01_P37 4905200 COMMODITY 101 COT_IND01_P101 5107550 这时,我们可以看到,分区37中的数据被接近于平分到了分区37和101中。 复制代码 代码如下: SQL> select * from v$lock where sid=1239 and type=\'TM\' and LMODE=6 order by sid,lmode; ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK ---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ---------- FFFFFFFF7D764828 FFFFFFFF7D764888 1239 TM 4004126 0 6 0 72 2 FFFFFFFF7D764828 FFFFFFFF7D764888 1239 TM 4004063 0 6 0 72 2 它们分别是什么对象呢? select OBJECT_NAME,SUBOBJECT_NAME,OBJECT_ID from user_objects where object_id in (4004126,4004063) OBJECT_NAME SUBOBJECT_NAME OBJECT_ID --------------------- ------------------------------ ---------- COMMODITY COT_IND01_P100 4004126 COMMODITY COT_IND01_P37 4004063
[code] 该测试案例中分区COT_IND01_P37中共有接近1千万条数据,耗时接近7分钟,假设分区数据达到了1亿条,则耗时应该在1个小时以上。如果我们的Hash分区数按Oracle的建议为2的整数幂,则我们在增加分区时是要增加原有分区一倍的新分区,比如原分区为128个,扩展的时候需要增加128个分区,乘以每次添加分区需要的时间,则为Hash表增加分区将是一个很恐怖的操作。 |
请发表评论