Oracle分割槽表基礎運維-03HASH分割槽

chenoracle發表於2020-05-14

Oracle 分割槽表基礎運維 -03HASH 分割槽

Hash Partitioning

Hash partitioning maps data to partitions based on a hashing algorithm that Oracle applies to the partitioning key that you identify.

The hashing algorithm evenly distributes rows among partitions, giving partitions approximately the same size.

Hash partitioning is the ideal method for distributing data evenly across devices. Hash partitioning is also an easy-to-use alternative to range partitioning, especially when the data to be partitioned is not historical or has no obvious partitioning key.

建立 HASH 分割槽表

---建立hash分割槽表hash_part_tab

create   table  hash_part_tab ( id   number , deal_date date , area_code number , contents   varchar2 ( 4000 ))

partition   by   hash   ( deal_date )

PARTITIONS   12 ;

--以下是插入一整年日期隨機數和表示福建地區號含義(591到599)的隨機數記錄,共有10萬條,如下:

insert   into  hash_part_tab

   ( id ,  deal_date ,  area_code ,   contents )

   select   rownum ,

         to_date ( to_char ( sysdate   -   365 ,   'J' )   +

                  TRUNC ( DBMS_RANDOM.VALUE ( 0 ,   365 )),

                  'J' ),

          ceil ( dbms_random.value ( 590 ,   599 )),

          rpad ( '*' ,   400 ,   '*' )

     from  dual

   connect   by   rownum   <=   100000 ;

commit ;

---檢視當前使用者下有哪些分割槽表

select  TABLE_NAME from  user_tables a where  a.partitioned = 'YES' ;

---檢視分割槽表名,分割槽名,表空間等資訊

select  table_name ,  partition_name ,  tablespace_name ,  high_value

   from  user_tab_partitions

  where  table_name =   'HASH_PART_TAB' ;

---通過object_id檢視每個分割槽資料分佈情況

select   *   from  dba_segments where  segment_name =   'HASH_PART_TAB' ;

select   *   from  dba_objects where  object_name = 'HASH_PART_TAB' ;

select  dbms_rowid.rowid_object ( rowid )  obj_id ,   count (*)

   from  HASH_PART_TAB

  group   by  dbms_rowid.rowid_object ( rowid )

  order   by   1 ;

hash partition不能直接增加分割槽,而是split當前分割槽 hash bucket總是2的N次方,如果分割槽數不足,則會合並資料,產生不均衡的情況,這樣增加分割槽時,只需要對應分割槽的資料做split即可。同理,減少分割槽也不是簡單的drop,而是合併分割槽。

例如上面我們建立了 12 個分割槽,實際上 hash bucket 數量是 2 4 次方,既 16 hash bucket ,多出的 4 hash bucket 會進行合併,會產生資料不均,也就是有 4 個分割槽的資料會比較多。即 OBJ_ID=77373,77374,77375,77376 四個分割槽資料較多。

---增加新分割槽P1

alter   table  HASH_PART_TAB add   partition  P1 ;

此時 OBJ_ID=77373 的分割槽,分裂成 OBJ_ID=77392 OBJ_ID=77393 ,資料由 11191 分成 5761 5431 分佈存在這兩個分割槽裡。

---增加新分割槽P2

alter   table  HASH_PART_TAB add   partition  P2 ;

---增加新分割槽P3

alter   table  HASH_PART_TAB add   partition  P3 ;

---增加新分割槽P4

alter   table  HASH_PART_TAB add   partition  P4 ;

此時有16 個分割槽了,是 2 4 次方,資料較比 12 個分割槽時,分佈更均勻了。

---增加新分割槽P5,第一個分割槽OBJ_ID=77369分裂成兩個新分割槽,其他分割槽資料不變。

alter   table  HASH_PART_TAB add   partition  P5 ;

HASH 分割槽表不能通過如下方式進行刪除

alter   table  HASH_PART_TAB drop   partition  P5 ;

ORA-14255: table is not partitioned by Range, List, Composite Range or Composite List method

歡迎關注我的微信公眾號"IT小Chen",共同學習,共同成長!!!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29785807/viewspace-2692265/,如需轉載,請註明出處,否則將追究法律責任。

相關文章